javascript - Promise Chaining 如何在内存中工作?

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

最佳答案

查看the V8 source code , 我们可以看到 when a Promise is created ,它绑定(bind)到当前执行上下文,即使您没有将它存储在变量中也是如此。

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 绑定(bind)到执行上下文,并且 Promise 链是作为链表实现的,这意味着一旦 Promise 实际解决,就很容易追溯。


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

关于javascript - Promise Chaining 如何在内存中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55202707/

相关文章:

javascript - JSON 格式错误

javascript - 如何在 JavaScript 中实现或使用继承?

android - 我的Android应用程序如何扫描自己的内存映射以查找已知的不良关键字,例如“Xposed”或“Frida”?

javascript - Angular $q 绑定(bind) this

javascript - div 中的图像 - 褪色边缘

javascript - 通过验证将 Angular 形式输入到数组

Python多处理 - 进程完成后如何释放内存?

r - 不同大小的矩阵的相同内存使用

javascript - 如何在 then() 中获取对当前 Promise 的引用

javascript - 只能为 AngularJS $http Promise 分配一个错误/成功函数吗?