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解决链被实现为一个简单的链表(强调我的):
PromiseReaction
对象形成一个单链表[...]。在JSPromise
实例上,它们以相反的顺序链接,并在微任务队列上调度它们时再次转换为正确的顺序。
简而言之,V8将Promises绑定到执行上下文,即使您不将它们存储在变量中,并且Promise链实现为链接列表,这意味着一旦Promise实际解析就很容易追溯。
为了更好地理解异步操作如何相互交互,请在Javascript事件循环中查看this video by Jake Archibald。