標題。我可以說,下面的兩段代碼是相等的:在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