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函数?
答案 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。