JavaScript如何知道Promise回调函数准备好执行?

4

我知道有一个消息队列和JavaScript是单线程的,还有一个事件循环,从队列中取出消息并执行一些工作。

当你创建一个Promise,并将其保存在消息队列中时,事件循环何时或如何知道它已被解决(或拒绝)。它会一直询问状态是否不是“挂起”吗?还是当Promise解决或拒绝时,它本身就排队到了消息队列中?

更新:

经过一些研究,我认为我弄错了。实际上,阻塞和运行的是XHR请求本身在其自己的线程中,以免阻塞主执行线程。因此,只有主执行线程是单线程的,当XHR请求获得结果(或失败)时,XHR线程将回调函数排队到主线程。

那么,根据this article的说法,Promise本身是否被保留在堆栈中,当其解决时将回调函数推送到队列中?


应用程序中的某个代码明确调用了在创建 Promise 时使用的处理程序函数中传递的 resolve()reject() 回调。 - Pointy
你为什么关心这个问题呢?是因为代码出了问题吗?还是只是对实现细节感到好奇? - Bergi
我认为OP是在询问浏览器拥有的任何其他线程是否正在跟踪异步操作,例如与网络协商。 - Abhinav Galodha
你考虑过阅读规范吗? - zzzzBov
有关微任务的相关文章。 - nem035
"is the promise itself being kept in the stack" 的意思是什么? - Bergi
3个回答

2
所以,对应于本文,承诺本身是否被保留在堆栈中,并且在解决时将回调函数推送到队列中?以下引用来自nem035建议的关于微任务的相关文章

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

尝试按步骤进行动画演示,

animated gif of going through the steps

第七步后,它达到了这个点:

promise then added to Microtasks queue

因此可以得出结论,承诺本身并未在堆栈中得到实现,而是将Promise then(回调函数)添加到Microtasks队列中,在堆栈为空后进行处理。

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


1
当承诺得到解决时,它将在队列上安排相关的函数调用。这里没有涉及轮询,那样会非常低效。

"schedule" 是什么意思?它会在 10ms 后再次检查吗? 我的意思是,http 请求本身是同步的,并明确地等待来自服务器的答案。但是 JavaScript 不等待,而是将其放回“队列”并继续执行其他任务。但是当和为什么会重新检查,如果请求完成,承诺解决并且回调可以执行? - Benjamin Dudler
这意味着“向事件循环发送消息,告诉它应该触发 Promise 回调函数”。这就是 Promise 实现的责任范围。当队列中有消息且当前没有任务正在运行时,事件循环将执行下一个任务。 - Bergi

0
我知道有消息队列和 JavaScript 是单线程的。还有事件循环,从队列中获取消息并执行一些工作。 当您创建一个 Promise 并将其保存在消息队列中时,循环如何或何时知道它何时解决(或拒绝)?它是否一直在询问状态是否不为“待定”,或者在解决或拒绝时 Promise 本身会进入消息队列排队?
Promise 不会“保存在消息队列”中,消息队列只包含微任务。事件循环对 Promise 一无所知。它只是从队列中挑选微任务进行执行。 当 Promise 实现或拒绝时,Promise 库会将所有已附加的thencatch 处理程序的任务放入队列中。(如果在 Promise 实现或拒绝后附加了thencatch 处理程序,则该任务会立即放入队列中。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接