JavaScript如何知道Promises回调函数何时可以执行?

时间:2017-05-08 16:40:47

标签: javascript promise stack task es6-promise

我知道有一个消息队列,而且JavaScript是单线程的。还有一个事件循环,从队列中获取消息并做一些工作。

当您创建承诺时,此承诺将保留在消息队列中,循环何时或如何知道何时解决(或拒绝)。它是否永久性地询问,如果状态不是"等待"或者,当解析或拒绝时,promise本身会排队到消息队列吗?

更新

经过一番研究,我认为我弄错了。它不是承诺本身,而是XHR请求实际上阻塞并在其自己的线程中运行 以阻止主执行线程。所以只有主执行线程是单线程的,当XHR请求得到结果(或失败)时,XHR线程会将回调排队到主线程。

因此,对应于this article,承诺本身是否保留在堆栈中,并在回调结束时将回调函数推送到队列中?

3 个答案:

答案 0 :(得分:1)

承诺将在解决时在队列上安排相关的函数调用 没有涉及民意调查,效率很低。

答案 1 :(得分:1)

  

因此,对应于this article,承诺本身是否保留在堆栈中,并在回调结束时将回调函数推送到队列中?

以下引文来自Related article on microtasks建议的nem035

  

一旦承诺结算,或者它已经解决,它会为其反动回调排队微任务。这确保了即使承诺已经解决,承诺回调也是异步的。 1

尝试浏览动画的逐步图表,例如:

promise then added to Microtasks queue

因此可以得出结论,承诺本身不会保留在堆栈中,但是 Promise然后(回调)被添加到Microtasks的队列中,这些队列被处理堆栈变空后。

1 <子> https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

答案 2 :(得分:0)

  

我知道有一个消息队列,而且JavaScript是单线程的。还有一个事件循环,从队列中获取消息并做一些工作。

     

当你创建一个promise,并且这个promise被保存在消息队列中时,循环何时或如何知道它何时被解析(或被拒绝)。它是永久性地询问,如果状态不是“待定”,还是承诺本身在解决或拒绝时排队到消息队列?

Promise不会“保留在消息队列中”,它只包含微任务。事件循环对promises一无所知。它只是从队列中选择微任务来执行。

当承诺履行或拒绝时,承诺库会将所有附加的thencatch处理程序的任务放入队列。 (如果在承诺完成或拒绝后附加thencatch处理程序,则该任务立即被放入队列。)