最近看了下 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 的更新策略会更及时些。
不过这个区别并不影响日常开发,因为通常开发中,应该不会过分依赖异步操作的顺序。