目的
async/await
を使うと非同期処理を同期的に書けるが、それが故に実行順が直感的に読み取りにくいことがある。
もちろんasync/await
の実体はPromiseなのでそれに読み替えれば正確な実行順はわかるが、ここではasync/await
のままでどう読んだら実行順が理解しやすいのかまとめる。
結論
-
await
キーワードに着目して読む。await
の次の行から非同期の実行になる1。 -
async
キーワードには着目しなくてよい。
詳細
async/await
とは
まず、async/await
とは何かをまとめる。
async/await
は非同期処理を同期処理のように書けるJavaScriptの構文。
await
を書くことで非同期処理を同期処理のように呼び出せる。await
を書けるのは非同期関数(async function)の中だけであり2、async functionを定義するのにはasync
を使う。
// fuga()はPromiseやasync function
async function hoge() {
await fuga();
}
hoge();
async/await
を使ったコードの挙動
結論を先取りすると、async
が付いていようがいまいがawait
がない限り非同期実行はされないということが言える。
例えば次のようなコードを考える。
async function fuga() {
console.log('2');
return;
}
async function hoge() {
console.log('1');
await fuga();
console.log('3');
}
hoge();
console.log("4");
このコードを実行すると、結果はこうなる。
# 結果
1
2
4
3
await fuga()
の次から非同期実行になっているので、その次の行の3だけ遅れて出力されている。
このコードからawait
を取り除くと、同期的に、順番通りに1、2、3、4が出力される。
async function fuga() {
console.log('2');
return;
}
async function hoge() {
console.log('1');
fuga();//<-- awaitを取り除いた
console.log('3');
}
hoge();
console.log("4");
# 結果
1
2
3
4
結論
-
ここで言っている非同期実行されない/されるというのは、「同期的に書かれたコードが」非同期実行されない/されるということ ↩ ↩2 ↩3
-
厳密にはasync functionの中以外で書けるケースがあるのだが、この記事ではそこまで立ち入らない 参考:top-level awaitがどのようにES Modulesに影響するのか完全に理解する ↩