首页 > 解决方案 > 当我们的 .then 回调被推送到微任务队列时,是否有可能在中间的某个地方放置另一个随机函数?

问题描述

当讲师说时,我正在 CodeSmith YouTube 频道观看有关 Promise 的视频,.then 使用回调函数并将该 cb 函数推送到隐藏的 onFulfillment 数组中,一旦 Promise 被解决,第一个参数是其解析的值,稍后将触发该数组和!

现在我认为细节有点不完整,因为我后来发现 .then 不仅将 cb 函数推送到隐藏的 onFulfilment 数组中以供以后执行,而且它还立即返回一个待处理的承诺,然后当该 cb 函数运行时以及任何值是返回,这就是使用 .then 返回的未决承诺解决的值!

我还注意到如果promise 立即解决,那么cb 函数将直接放入微任务队列!

现在我的问题是,假设我有这个代码:

let p = new Promise(r => setTimeout(r, 1000, 'someValue'))

p.then() x 1000 times 

是的,如果我们有 1000 个 .thens 怎么办?

现在我确实意识到所有 1000 个函数将被同步推送到隐藏的 onFulfillment 数组中,并且只有在 Promise 解决后才会执行,但这就是我有点困惑的地方!

一旦一个promise被解决,它应该从数组中获取一个函数并放入微任务队列,它会为我们传递的许多函数执行此操作(我只看到人们做一个.then)

...但在我们的例子中,它是 1000,那么这将如何工作?

有没有可能只有 20 个函数被放入微任务队列,然后一些完全随机的函数被推到中间?

如果我的 P2 已经解决,所以它的功能也将被放入微任务队列中,这样会不会发生冲突?像来自 p 的 20 被推入微任务队列,然后来自 p2 的 5 被推入微任务队列,反之亦然?

我知道,实际上我永远不会这样做,但我出于好奇而问这个问题,我检查了谷歌并试图找到任何可以回答这个问题的东西,所以任何帮助都将不胜感激。

标签: javascriptasynchronouspromisescheduled-tasksevent-loop

解决方案


一旦 Promise 被解决,它应该从数组中获取一个函数并放入微任务队列,无论我们传递多少函数,它都会这样做。

是的,它只是一次将它们全部放入队列中。即使它有 1000 多个工作岗位。

有没有可能只有 20 个函数被放入微任务队列,然后一些完全随机的函数被推到中间?

不。

但是,你不应该依赖这种行为——如果你关心你的 Promise 的两个处理程序之间的时间,或者将它们一个接一个地链接起来,或者将两个代码放入同一个处理程序中。


推荐阅读