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已绑定到当前执行上下文,即使您没有将其存储在变量中.
原文链接:https://www.f2er.com/js/531226.htmlNode* const native_context = LoadNativeContext(context);
Node* const promise = AllocateAndInitJSPromise(context);
查看how promises are implemented,我们可以看到Promise解决方案链是作为一个简单的链表(强调我的链)实现的:
The
PromiseReaction
objects form a singly-linked list […]. On theJSPromise
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.