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:Unexpectedtoken不inJSONatposition0atJSON.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