保证链接在记忆中如何工作



function foo() {
  console.log('foo called')
  return Promise.resolve(5)
}
foo()
  .then(res => {
    console.log(res)
  })
console.log('hi')

控制台输出:

1.) 'foo called'
2.) 'hi'
3.) 5

我的主要问题是,当整体执行上下文线程完成并弹出执行堆栈时,实际发生了什么。如果未将承诺对象分配给全局执行上下文中的变量,JS/V8如何知道该承诺对象在内存中的位置?它如何知道在哪里更新承诺价值并触发onfullfilment函数?

查看v8源代码,我们可以看到,即使您不将其存储在变量中。<<<<<<<<<<<</p>

Node* const native_context = LoadNativeContext(context);
Node* const promise = AllocateAndInitJSPromise(context);

查看承诺的实施方式,我们可以看到,承诺解决链被用作简单的链接列表:

PromiseReaction对象形成单连接的列表[...]。在JSPromise实例上,它们以相反的顺序链接,并在Microtask队列中安排它们时再次将其转换为适当的顺序。

不久,V8即使您不将其存储在变量中,并且将承诺链作为链接列表实现,即使将其存储在执行上下文中,也可以将其绑定。


为了更好地更好地了解Async操作如何相互作用,请查看Jake Archibald在JavaScript事件循环中的视频。