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 的更新策略会更及时些。

不过这个区别并不影响日常开发,因为通常开发中,应该不会过分依赖异步操作的顺序。

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