Promise Chaining如何在内存中工作?

时间:2019-03-17 00:06:46

标签: javascript memory promise v8 execution

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

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

1 个答案:

答案 0 :(得分:2)

the V8 source code看,when a Promise is created绑定到了当前执行上下文,即使您没有将其存储在变量中。

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

看看how promises are implemented,我们可以看到Promise解析链是作为一个简单的链表(强调我的链)实现的:

  

PromiseReaction对象形成一个单链接列表 [...] 。在JSPromise实例上,它们以相反的顺序链接,并在微任务队列上安排它们时再次变成正确的顺序。

简而言之,即使您不将Promises存储在变量中,并且将Promise链实现为链接列表,V8也会将Promises绑定到执行上下文,这意味着在Promise实际解决后很容易进行追溯。


要更全面地了解异步操作之间如何交互,请查看Javascript事件循环上的this video by Jake Archibald