当サイトは、アフィリエイト広告を利用しています
非同期関数を定義する関数定義で関数の前につける。 asyncをつけた関数は Promiseインスタンスを返却するようになる
Promiseについては下記記事でまとめている
Promiseで関数を作った場合とasyncで関数を作って場合を比較する。
//asyncを使ったverconst asyncFunc = async (value) => value;// 通常関数で Promise を返却するconst promiceFunc = async (value) =>new Promise((resolve, reject) => {resolve(value);});asyncFunc(1).then((val) => console.log(val)); //1promiceFunc(1).then((val) => console.log(val)); //1
asyncFunc中でreturn されたとき、戻り値で Promise.resolve する
要するにaync関数内でreturnするとresolve()してるとの同義
だから呼び出し元でthen()で繋げられる
async function で定義された関数内で throw された場合、
そのthrow の値でPromise.reject が実行される。
要するにthrow new Errorするとreject()してるとの同義。
呼び出し元でcatchできる
//asyncを使ったverconst asyncFunc = async (value) => {if (value > 100) {return "OK";} else {// throwthrow new Error("NG");}};// 通常関数で Promise を返却するconst promiceFunc = async (value) =>new Promise((resolve, reject) => {if (value > 100) {resolve("OK");} else {reject("NG");}});// catch() で例外処理を行えるasyncFunc(1).catch((error) => console.log(error.message));//NGpromiceFunc(1).catch((error) => console.log(error));//NG
awaitはasyncとセットで使う。
まずはawaitなしで書いてみる
// setTimeout を Promise でラップconst wait = (ms) =>new Promise((resolve) =>setTimeout(() => resolve(console.log("resolve")), ms));// asyncconst awaitFunc = async () => {console.log(1);wait(3000);console.log(2);};awaitFunc();
実行すると
12resolve
wait処理は非同期のため1,2の方が先に実行されてしまう。
wait関数にawaitを付ける。
※wait関数はawaitを付けるためにPromiseでラップしている
// setTimeout を Promise でラップconst wait = (ms) =>new Promise((resolve) =>setTimeout(() => resolve(console.log("resolve")), ms));// asyncconst awaitFunc = async () => {console.log(1);await wait(3000); // Promise が返ってくるまで awaitで 処理停止console.log(2); // 約3秒経過に表示};awaitFunc();// 実行結果// 1// resolve// 2
awaitをつけることによってwait関数の実行を待ってから処理できている
awaitの詳しい挙動について下記でまとめた
Promiseとasync/awaitを使用した時のエラーハンドリングパターンについて
まとめる。
async/awaitを組み合わせたエラーハンドリングパターン
errorPromise関数が正常に終了した場合はerrorPromise関数でresolveした
値がresultに入り、errorが発生した場合はcatchした値がresultに入る
// エラープロミス関数const errorPromise = () => {return new Promise((resolve, reject) => {try {//エラー発生させるthrow new Error("Some error occured");} catch (err) {//エラーが発生してるのでrejectが返却されるreject(err);}});};const asyncFuncNoTryCatch = async () => {//errorPromise関数を実行//errorPromise関数でerrorをthrowするためresultには値は入らないconst result = await errorPromise().catch(err => console.log(err))console.log(result)}asyncFuncNoTryCatch() // Some error occured
errorPromise関数をasync無名関数でラップし
async無名関数内でtry~catchしてエラーハンドリングする
// エラープロミス関数const errorPromise = () => {return new Promise((resolve, reject) => {try {//エラー発生させるthrow new Error("Some error occured");} catch (err) {//エラーが発生してるのでrejectが返却されるreject(err);}});};//async無名関数でラップconst asyncFuncTryCatch = async () => {try {//errorPromise関数を実行const result = await errorPromise()console.log(result) // unreachable(到達不能)} catch (err) {//エラーハンドリングconsole.log(err)}}asyncFuncTryCatch() // log. Some error occured
こっちの方をよく使う。
javascriptのasyncとawaitをまとめてみた。
jsを使う仕事をしている時は当たり前すぎて、気にもとめていないが
しばらく使わないと忘れるので忘備録として残す