我知道有一个消息队列,而且JavaScript是单线程的。还有一个事件循环,从队列中获取消息并做一些工作。
当您创建承诺时,此承诺将保留在消息队列中,循环何时或如何知道何时解决(或拒绝)。它是否永久性地询问,如果状态不是"等待"或者,当解析或拒绝时,promise本身会排队到消息队列吗?
因此,对应于this article,承诺本身是否保留在堆栈中,并在回调结束时将回调函数推送到队列中?
答案 0 :(得分:1)
承诺将在解决时在队列上安排相关的函数调用 没有涉及民意调查,效率很低。
答案 1 :(得分:1)
因此,对应于this article,承诺本身是否保留在堆栈中,并在回调结束时将回调函数推送到队列中?
以下引文来自Related article on microtasks建议的nem035:
一旦承诺结算,或者它已经解决,它会为其反动回调排队微任务。这确保了即使承诺已经解决,承诺回调也是异步的。 1
尝试浏览动画的逐步图表,例如:
因此可以得出结论,承诺本身不会保留在堆栈中,但是 Promise然后(回调)被添加到Microtasks的队列中,这些队列被处理堆栈变空后。
1 <子> https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ 子>
答案 2 :(得分:0)
我知道有一个消息队列,而且JavaScript是单线程的。还有一个事件循环,从队列中获取消息并做一些工作。
当你创建一个promise,并且这个promise被保存在消息队列中时,循环何时或如何知道它何时被解析(或被拒绝)。它是永久性地询问,如果状态不是“待定”,还是承诺本身在解决或拒绝时排队到消息队列?
Promise不会“保留在消息队列中”,它只包含微任务。事件循环对promises一无所知。它只是从队列中选择微任务来执行。
当承诺履行或拒绝时,承诺库会将所有附加的then
或catch
处理程序的任务放入队列。 (如果在承诺完成或拒绝后附加then
或catch
处理程序,则该任务立即被放入队列。)