Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8835

Node.jsのasync/awaitとPromiseを超ざっくり_中編

$
0
0

Node.jsのasync/awaitとPromiseを超ざっくり_前編の続きです。後でまとめるかも。
※arrow関数は使わないといったな、あれは嘘だ。

目次

1. Node.jsの非同期処理について

2. 非同期処理の書き方

2.1 コールバック(callback)関数

2.2 Promise

2.3 asycn/await ←この記事はココから!

3. Promiseとasycn/awaitが一緒だと思ったらハマった件
4. 参考

2.3.asycn/await

asycn/awaitとはPromiseのシンタックスシュガー。
(同じような内容のことをもっと簡単な書き方でできるよ、というもの。)

async

Promiseの場合は

functionhoge(){returnnewPromise((resolve,reject)=>{//処理resolve('success')//orreject('error')})}

というように明示的にPromiseをリターンしていたが、asyncを使って書くと以下のように書ける。

asyncfunction()hoge{//処理return'success'//orthrownewError('error')}

asyncで宣言した関数内は
・Promiseを返す。
・値をreturnするとPromiseをresolveする
・エラーをthrowするとPromiseをrejectする

await

・async functionの中でしか使えない
・Promiseが resolve or rejectされるまでasync functionの処理を待つ
使用例)

//プロミスを返す非同期functionfunctionaddNum_promise(num1,num2){returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve(num1+num2);},1000);})}asyncfunctionexample(num1,num2){//[2]constres=awaitaddNum_promise(num1,num2)//Promsieがresolveされるまで待つreturnres+10}(async()=>{console.log('start')  //[1]console.log(awaitexample(1,2))console.log('end')})()
console
//結果
start
13
end

Promiseを返すfunctionにawaitをつけて呼び出すことで処理の順番が同期的になっていることがわかります。
ちなみに[1]、[2]のawaitを外してみた場合はそれぞれこのようになります

//*******************[1]asyncfunctionexample(num1,num2){constres=awaitaddNum_promise(num1,num2)//Promsieがresolveされるまで待つreturnres+10}(async()=>{console.log('start')  //[1]await外す//console.log(await example(1,2))console.log(example(1,2))console.log('end')})()//*******************[2]asyncfunctionexample(num1,num2){//[2]await外す//const res = await addNum_promise(num1, num2) //Promsieがresolveされるまで待つconstres=addNum_promise(num1,num2)//Promsieがresolveされるまで待つreturnres+10}(async()=>{console.log('start')  console.log(awaitexample(1,2))console.log('end')})()
console
[1]のawaitを外した場合
start
Promise { pending }
end

[2]のawaitを外した場合
start
[object Promise]10
end

[1]の場合はfunction「example」が返すPromiseがまだ準備中だよ(未resolve)~って意味
[2]の場合はfunction「addNum_promise」のPromise(res)がresolveされていない状態でres+10をreturn(==resolve)しているので上のような結果になる。[object Promise]の中身はPromise { pending }である。

上の2つをまとめると
[1]function「example」が未解決という結果が返された
[2]function「example」が解決済(function「addNum_promise」が未解決+10)という結果が返された

書いててよくわからなくなったので続きはまた後日...(薄く延ばす戦法)

4.参考

Node.js 非同期処理・超入門 -- Promiseとasync/await
Node.jsデザインパターン
async/await 入門(JavaScript)


Viewing all articles
Browse latest Browse all 8835

Trending Articles