最近看了下 JS 異步編程的發展史。這是其中一篇文章:JavaScript 異步編程。
在文章中發現有個例子的異步執行順序和我自己執行的不一樣。
先貼出測試代碼:
async function async1(){
console.log('async1 start')
await async2()
console.log('async1 end')
}
async function async2(){
console.log('async2')
}
console.log('script start')
setTimeout(() => {
console.log('setTimeout')
})
async1()
new Promise((resolve) => {
console.log('promise1')
resolve()
})
.then(() => {
console.log('promise2')
})
console.log('script end')
下面是不同的node版本的執行結果:
測試後發現:
在 node 8.0.0 版本中 promise2 在 async1 end 後打印
在 node 10.10.0 版本中 promise2 在 async1 end 前打印
在 node 12.10.0 版本中 promise2 在 async1 end 後打印
原因是因爲不同的 V8 引擎版本對 await 的處理不一樣。
原文作者推薦看這個 https://www.zhihu.com/question/268007969
簡單解釋下文中的說明:
按照目前最新的V8版本,await將直接使用Promise.resolve()相同語義。 應該是 promise2 在 async1 end 後打印。
也就是 V8 引擎對於 await 的處理經歷了修改又改回的歷程。
還有就是“一般來說,當遇到Chrome和Node.js在JavaScript運行方面有差異,應以最新的Chrome的行爲爲準。”,因爲 Chrome 的更新策略會更及時些。
不過這個區別並不影響日常開發,因爲通常開發中,應該不會過分依賴異步操作的順序。