在Promise.race中解决(拒绝)第一个承诺后,执行是否结束?

时间:2016-10-29 10:41:54

标签: javascript node.js asynchronous parallel-processing promise

我无法理解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收集。

1 个答案:

答案 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()对异步操作本身的执行没有影响 - 它只是提供有关第一次异步操作何时完成的通知。