2017-10-12 47 views
0

標題。我可以說,下面的兩段代碼是相等的:在JavaScript中未指定保證執行順序嗎?

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

和:

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

我想,它看起來像他們是平等的,但有一個疑問(例如,某些優化)

+0

不,優化不能混淆語義。 – Bergi

回答

2

是的,它們完全一樣,或多或少都是語法糖。 await導致執行暫停,直到等待解決的Promise

請參閱Javascript async有關重寫承諾鏈以獲取更多信息的部分。

+0

這個東西:這部分沒有分配就錯過了。但我相信你是對的 – kharandziuk

2

爲了擴大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()不停止執行流程和運行鏈下一個函數,只有當先前的承諾結束。有時你希望發生這種情況,有時候你不會,有時候這並不重要。但是如果你不瞭解這一點,可能需要一些時間才能搞清楚。所以我希望這個例子能幫助你理解它。