我无法理解Promise.race
行为是什么。在承诺数组中的第一个承诺实例被解决(被拒绝)后,是否会停止,忽略所有其余的?
我的目标是来执行数组中的所有承诺。在任何顺序中都应该执行。
一个例子。可以说array_of_urls
有10个网址。 Promise.race
将以任何顺序逐个执行所有10个承诺,还是会在第一个承诺之后停止?
.then(array_of_urls => {
// array_of_urls == [10 urls]
let array_of_promises = array_of_urls.map((url) => {
return fetch(url).then(res => {
return res;
});
});
return Promise.race(array_of_promises);
})
.then(each_and_every_result => {
// What does happen here? Will this `then` callback be called 10 times or just one?
})
Promise
有方法可以执行所有操作吗?
PS:
MDN doesn't explain如果全部将被执行或将停止:
竞赛函数返回一个Promise,其结算方式与第一个通过的结算承诺相同。它解决或拒绝,以先发生者为准。
UPD:
对不起,没有解释它是正确的。我确实需要在数组中执行所有promise,但不是Promise.all
执行它的方式。是的,Promise.all
执行所有操作,但它等待所有执行完毕,收集结果然后返回一个包含所有结果的数组。每当这10个中的一个满满时,我需要召唤一个回调。没有waithig,所有这些都被Promise.all
收集。
答案 0 :(得分:5)
Promise只是异步操作的通知系统。它们根本不控制异步操作。实际上,情况正好相反,异步操作控制着承诺。因此,无论是使用Promise.race()
还是Promise.all()
还是使用其他方案,都不会影响底层的异步操作。它只会影响您完成异步操作的通知类型。
因此,当您使用Promise.all()
时,如果所有异步操作都已成功完成或者出现错误,则会收到通知。如果有错误,则所有其他异步操作仍在运行,并将运行至正常完成。只有您的Promise.all(...).then()
处理程序会受到影响。
当您使用Promise.race()
时,您只是在第一次异步操作完成时收到通知。其他异步操作仍将正常运行。
如果您希望在每个异步操作完成时收到通知,那么您只需为每个单独的承诺附加一个.then()
处理程序,那些.then()
处理程序根本不受您的影响承诺数组上的Promise.all()
或Promise.race()
- 这只是另一个通知。
我发现最好将promises视为异步操作的通知机制。一旦启动,它们根本不控制异步操作。相反,它们提供有关完成异步操作时会发生什么的结构化通知。
//这里发生了什么?这个
then
回调是否会被调用10次 还是只有一个?
承诺只会解决或拒绝一次,因此您的Promise.all(...).then()
或Promise.race(...).then()
处理程序只会被调用一次。
Promise.race将以任何顺序逐一执行所有10个承诺, 还是会在第一次之后停止?
当您致电Promise.race()
时,您的异步操作已经开始并且它们都已在进行中。他们都将被执行。 Promise.race()
对异步操作本身的执行没有影响 - 它只是提供有关第一次异步操作何时完成的通知。