我有两个函数,一个函数,asyncTest_returnPromise只返回一个诺言,另一个函数,asyncTest,通过调用承诺数组中的Promise.all(承诺)调用3次。在数组中的每个承诺中,在调用asyncTest_returnPromise函数之前,我向控制台发送一个值("Foo"),并在调用后将另一个值("Bar")发送到控制台。
考虑到我对Promise.all函数的理解,我希望数组中的每个承诺只有在实现了随后的承诺之后才会被处理,这意味着由于两个console.log语句都在数组中的每个承诺中,结果将是:
相反,输出似乎是: Foo Bar Bar
由于"Foo“的所有实例在第一个"Bar”之前都已发送到控制台,在我看来,这些承诺必须同时处理。
以下是两个功能:
function asyncTest_returnPromise() {
return new Promise((resolve, reject) => {
resolve()
})
}
function asyncTest() {
var promises = []
for (i = 0; i < 3; i++) {
promises.push(new Promise((resolve, reject) => {
console.log("Foo")
asyncTest_returnPromise().then(_ => {
console.log("Bar")
resolve();
})
}))
}
Promise.all(promises)
}
asyncTest();
所以我想知道,我是否误解了Promise.all的目的或它是如何工作的?我的代码的其他部分是否在所有"bar“输出之前导致了所有"foo”输出?在进入下一个承诺之前,我需要做些什么来完成所有的承诺吗?
发布于 2020-01-27 12:47:49
这就是事件循环的工作原理。让我用简单的词来解释它是如何处理的
console.log('Foo');,然后创建另一个由.then()调用排队的微任务(另一个承诺)。因此,这个额外的微任务被放入队列中(在这三个最初的微任务后面)。它会发生在每个由循环创建的微任务(所以它是3次)。这是Foo打印3次的地方。console.log('Bar');的微任务。这也发生了三次。这里是Bar打印3次的地方。当然,在Event循环中会发生更多的事情,但本质上这就是您在这里的承诺所发生的事情。
发布于 2020-01-27 12:37:16
它们是异步运行的。
每一次循环你:
immediately)
问题后,将
then解析为排队以运行该函数)
然后在下一次迭代中循环。
之后,当asyncTest函数完成时,事件循环可以自由地查看排队的函数。
因为所有的承诺都被解决了,所以它们都运行(和日志栏)。
如果您想在再次循环之前等待的承诺,那么您应该查看the await keyword,它会让asyncTest暂停(然后进入睡眠),直到承诺解除为止。
https://stackoverflow.com/questions/59931271
复制相似问题