Promise Chaining 如何在内存中工作?

How does Promise Chaining work in memory?

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 函数?

查看the V8 source code, we can see that when a Promise is created,它绑定到当前执行上下文,即使您不将其存储在变量中。

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

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

The PromiseReaction objects form a singly-linked list [...]. On the JSPromise instance they are linked in reverse order, and are turned into the proper order again when scheduling them on the microtask queue.

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


为了更全面地更好地理解异步操作如何相互交互,请查看 Javascript 事件循环中的 this video by Jake Archibald