![]() |
1
4
简单的答案是,在forEach的情况下,你要制作3个短的承诺链,而在reducer的情况下你要制作1个长的复杂链。3条短链分别只等待它们最初的承诺,但长链通过代码
现在来谈谈细节。
首先,我要指出,这几行代码开始了超时
立即
。因此,无论以后发生什么,计时器都将始终在100毫秒、500毫秒和10000毫秒时关闭(加上或减去计时器通常的不精确性)。这个
考虑到这一点,让我们看看foreach的情况,因为它是最简单的。我会把它扔掉
您的函数首先被调用10000ms promise。您等待10000毫秒的承诺,这会导致您的函数返回自己的承诺。
100毫秒后,最初的承诺就解决了。这意味着您的函数的第三个实例现在可以恢复,第三个可以注销。在500ms标记处,原始承诺解析,允许恢复函数的第二个实例。最后,在10000ms标记处,该函数的第一个实例可以恢复。 现在,让我们把注意力转向减速器案例。
在第一次迭代中,
现在我们进入第二次迭代
现在我们已经完成了同步代码,一个微任务进入队列,第一个函数在
过了一会儿,100毫秒的承诺就实现了。没有什么直接等待它,所以在这一点上没有发生任何事情。稍后,500毫秒的承诺得以实现。同样,没有什么直接等待它。甚至在稍后,10000米的承诺也会实现。这允许恢复第一个功能。它记录“嗨”,然后返回,从而解决了自己的承诺。因为它解决了它的承诺,函数2(它耐心地坐在上面
|
![]() |
Jess The Witch · GCP云功能中处理延迟任务的模式 5 月前 |
![]() |
Plup · 连接失败时,PyMongo异步客户端未引发异常 6 月前 |
![]() |
user1233894 · 尝试从全局函数传递值 6 月前 |
![]() |
Fabiano Taioli · 管理单线程Rust中的阻塞函数 10 月前 |
![]() |
river7816 · 为什么spdlog不在async函数中打印 11 月前 |