async functionのMDNドキュメントは、現在、await
を使用する2つの方法の以下の結合された例を示しています。私は強調のためにちょうど少し並べ替えました:`await`はいつ同時に解決されますか?
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function add1(x) {
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
}
async function add2(x) {
const p_a = resolveAfter2Seconds(20);
const p_b = resolveAfter2Seconds(30);
return x + await p_a + await p_b;
}
add1(10).then(v => {
console.log(v); // prints 60 after 4 seconds.
});
add2(10).then(v => {
console.log(v); // prints 60 after 2 seconds.
});
これは私に少し驚きでした。
return x + await p_a + await p_b;
は一見、同時に2つの約束を解決しながら、なぜ
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
は、順次2つの約束を解決するのでしょうか?この動作は、具体的にはawait
に指定されていますか、それとも他の何かの自然な結果ですか?あなたはP_AおよびP_Bを待っていたときに、このステートメントP_AおよびP_Bで
おかげで、私はしかし、このために、もう少し具体的なルールで参照をしたいと思います。例えば。おそらくそれは言語レベルのステートメントと関係がありますが、明らかに "ライン"はここで簡素化されていますか? – natevw
'複数の待機式を持つ関数は、実行を中止して次の待機式に移る前に、Promiseが決着するまで式を待つごとに一度停止されます。生成器とyieldで観測される場合と異なります。出典:https://ponyfoo.com/articles/understanding-javascript-async-await – Dez
@Dezええと。しかし、複数のawait文が1つの式の中に現れるとき/ステートメント/___? – natevw