【问题标题】:How does Promise Chaining work in memory?Promise Chaining 如何在内存中工作?
【发布时间】:2019-08-07 17:16:54
【问题描述】:

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

【问题讨论】:

  • 我会看看 javascript 的事件循环是如何工作的。

标签: javascript memory promise v8 execution


【解决方案1】:

查看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 实例上,它们以相反的顺序链接,并在将它们调度到微任务队列时再次转换为正确的顺序。

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


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

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2021-04-16
    • 2021-12-22
    • 2017-04-03
    • 2014-11-21
    • 2023-03-17
    • 2020-02-26
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多