2017-10-31 3 views
5

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で

+0

おかげで、私はしかし、このために、もう少し具体的なルールで参照をしたいと思います。例えば。おそらくそれは言語レベルのステートメントと関係がありますが、明らかに "ライン"はここで簡素化されていますか? – natevw

+0

'複数の待機式を持つ関数は、実行を中止して次の待機式に移る前に、Promiseが決着するまで式を待つごとに一度停止されます。生成器とyieldで観測される場合と異なります。出典:https://ponyfoo.com/articles/understanding-javascript-async-await – Dez

+0

@Dezええと。しかし、複数のawait文が1つの式の中に現れるとき/ステートメント/___? – natevw

答えて

7
async function add2(x) { 
    const p_a = resolveAfter2Seconds(20); 
    const p_b = resolveAfter2Seconds(30); 
    return x + await p_a + await p_b; 
} 

は(すなわち、できるだけ早くあなたが約束を生成するよう)並行して開始されているので、彼らは、平行ではなく、シーケンシャル表示されます。

あなたがする必要があります(直列に待っています)他の機能を取得するには:

return x + await resolveAfter2Seconds(20) + await resolveAfter2Seconds(30); 
+0

ああ、今、完璧な意味があります:-)これは、評価async関数の呼び出しは、awaitステートメント自身の構文/コンテキストとは関係ありません。ありがとう! – natevw

関連する問題