V8引擎不同版本對 await 處理方式差異

最近看了下 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 的更新策略會更及時些。

不過這個區別並不影響日常開發,因爲通常開發中,應該不會過分依賴異步操作的順序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章