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

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已绑定到当前执行上下文,即使您没有将其存储在变量中.

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.

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...