件名。以下の2つのコードは等しいと言えますか?
await someFunc() // no assignment here
doSomethingAfterSomeFunc()
そして:
someFunc().then(() =>
doSomethingAfterSomeFunc()
)
試してみましたが、同じように見えますが、疑問があります(例:最適化)
はい、それらはまったく同じです、それは多かれ少なかれ構文糖衣です。 awaitにより、待機中のPromise
が解決されるまで実行が一時停止します。
詳細については、 Javascript async promiseチェーンの書き換えに関するセクションを参照してください。
Dan Dの答え (自分自身を理解するのに時間がかかったため)を拡張するために、実行フローについてもう少し説明します。実際、await
を使用すると、解決されるまで、呼び出されたメソッドのフローがブロックされます。この非同期関数があるとしましょう:
_const someFunc = (str) => {
return new Promise(resolve => {
setTimeout(() => {
console.log('resolving promise')
resolve()
}, 1500)
})
}
_
したがって、次のように、awaitで呼び出すと:
_console.log('before calling')
await someFunc()
console.log('after calling')
_
次の結果が得られます。
_before calling
resolving promise
after calling
_
ただし、.then()
を使用する場合:
_console.log('before then')
someFunc().then(() => console.log('resolved'))
console.log('after then')
_
これは起こります:
_before then
after then
resolving promise
resolved
_
これは、.then()
が実行フローを停止せず、前のpromiseが終了した場合にのみ、チェーン内の次の関数を実行するためです。これを実現したい場合もあれば、そうでない場合もありますが、問題ではない場合もあります。しかし、これについて知らない場合は、理解するのに時間がかかることがあります。したがって、この例が理解に役立つことを願っています。