V8 Async
Reference: https://v8.js.cn/blog/fast-async/
一个代码段球输出的题目:
const p = Promise.resolve();
(async () => {
await p;
console.log('after:await');
})();
p.then(() => console.log('tick:a'))
.then(() => console.log('tick:b'));
这段代码的输出,Node.js 8和10并不一样。
最“政治正确”的输出,应该是tick:a, tick:b, after:await。
但是,Node.js 8中是after:await, tick:a, tick:b。
但是,p是一个resolve
的microtask
!这里await p
是不是应该被直接跳过,先执行after:wait
呢?
接下来,让我们看看 V8 引擎底层是如何实现 await 规范的。这是一个简单的异步函数 foo:
async function foo(v) {
const w = await v;
return w;
}
当函数调用时,它会将参数 v 包装为 Promise 并暂停执行异步函数,直到该 Promise 的状态变为 resolved。一旦发生这种情况,函数的执行将恢复并且这个 fulfilled 的 Promise 的值被赋值给 w。然后从异步函数中返回此值。