web-dev-qa-db-ja.com

JavaScriptでの割り当てなしの実行順序を保証しますか?

件名。以下の2つのコードは等しいと言えますか?

await someFunc() // no assignment here
doSomethingAfterSomeFunc()

そして:

someFunc().then(() => 
  doSomethingAfterSomeFunc()
)

試してみましたが、同じように見えますが、疑問があります(例:最適化)

11
kharandziuk

はい、それらはまったく同じです、それは多かれ少なかれ構文糖衣です。 awaitにより、待機中のPromiseが解決されるまで実行が一時停止します。

詳細については、 Javascript async promiseチェーンの書き換えに関するセクションを参照してください。

6
Dan D

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が終了した場合にのみ、チェーン内の次の関数を実行するためです。これを実現したい場合もあれば、そうでない場合もありますが、問題ではない場合もあります。しかし、これについて知らない場合は、理解するのに時間がかかることがあります。したがって、この例が理解に役立つことを願っています。

7
Almighty Baka