标题。我可以说,下面的两段代码是相等的:在JavaScript中未指定保证执行顺序吗?
await someFunc() // no assignment here
doSomethingAfterSomeFunc()
和:
someFunc().then(() =>
doSomethingAfterSomeFunc()
)
我想,它看起来像他们是平等的,但有一个疑问(例如,某些优化)
标题。我可以说,下面的两段代码是相等的:在JavaScript中未指定保证执行顺序吗?
await someFunc() // no assignment here
doSomethingAfterSomeFunc()
和:
someFunc().then(() =>
doSomethingAfterSomeFunc()
)
我想,它看起来像他们是平等的,但有一个疑问(例如,某些优化)
是的,它们完全一样,或多或少都是语法糖。 await导致执行暂停,直到等待解决的Promise
。
请参阅Javascript async有关重写承诺链以获取更多信息的部分。
这个东西:这部分没有分配就错过了。但我相信你是对的 – kharandziuk
为了扩大Dan D's answer(因为花了我一段时间才弄明白我自己),我会再说一些关于执行流程的事情。事实上,使用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()
不停止执行流程和运行链下一个函数,只有当先前的承诺结束。有时你希望发生这种情况,有时候你不会,有时候这并不重要。但是如果你不了解这一点,可能需要一些时间才能搞清楚。所以我希望这个例子能帮助你理解它。
不,优化不能混淆语义。 – Bergi