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是一个resolvemicrotask!这里await p是不是应该被直接跳过,先执行after:wait呢?

接下来,让我们看看 V8 引擎底层是如何实现 await 规范的。这是一个简单的异步函数 foo:

async function foo(v) {
  const w = await v;
  return w;
}

当函数调用时,它会将参数 v 包装为 Promise 并暂停执行异步函数,直到该 Promise 的状态变为 resolved。一旦发生这种情况,函数的执行将恢复并且这个 fulfilled 的 Promise 的值被赋值给 w。然后从异步函数中返回此值。