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

[Node.js] 非同期処理 - async/await編

$
0
0

async/await

async/await構文

functionparseJSONAsync(json){returnnewPromise((resolve,reject)=>{setTimeout(()=>{try{resolve(JSON.parse(json))}catch(err){reject(err)}},1000)})}asyncfunctionasyncFunc(json){try{constresult=awaitparseJSONAsync(json);console.log('パース結果',result);}catch(err){console.log('エラーをキャッチ',err);}}asyncFunc('{"foo": 1}')asyncFunc('不正なJSON')>>>ース結果{foo:1}エラーをキャッチSyntaxError:UnexpectedtokeninJSONatposition0atJSON.parse(<anonymous>)...(省略)

asyncキーワードの付いた関数は必ずPromiseインスタンスを返します。それは関数内で非同期処理が実行されない場合でも、同様です。

asyncfunctionasyncReturnFoo(){return'foo'}constresult=asyncReturnFoo()console.log(result)>>>Promise{'foo'}

また、async関数内でエラーが投げられると、async関数はrejectedなPromiseインスタンスを返します。

asyncfunctionasyncTrhow(){thrownewError('エラー')}constresult=asyncTrhow()console.log(result)>>>Promise{<rejected>Error:エラー...(省略)}(node:23161)UnhandledPromiseRejectionWarning:Error:エラー...(省略)

awaitはasync関数ないの処理を一時停止するものの、非同期I/Oのようにスレッドの処理をブロックするわけではありません。asunc関数が一時停止している間も、async関数の外の処理は動作を続けます。

asyncfunctionpauseAndResume(pausePeriod){console.log('pauseAndResume開始')awaitnewPromise(resolve=>setTimeout(resolve,pausePeriod))console.log('pauseAndResume終了')}pauseAndResume(1000)console.log('async関数外の処理はawaitの影響を受けない')>>>pauseAndResume開始async関数外の処理はawaitの影響を受けないpauseAndResume終了

並行処理

async/await構文には並行実行のための機能はないため、Promise.all()などのスタティックメソッドと組み合わせる必要がある。

asyncfunctiondoSomethingAsyncConcurrently(){constresult=awaitPromise.all([asyncFunc1(),asyncFunc2(),asyncFunc3()]);}

for await ...of 構文

for await ... of はasyncイテラブルに対して反復処理を行います。
asyncジェネレータ関数を使って簡単な例を書いてみます。

syncfunction*asyncGenerator(){leti=0;while(i<=3){awaitnewPromise(resolve=>setTimeout(resolve,1000));yieldi++}}forawait(constvalueofasyncGenerator()){console.log(value);}>>>0123

Viewing all articles
Browse latest Browse all 9409

Trending Articles