在promise .race中第一个promise被解析(拒绝)后执行是否结束

Does the execution finishes after the very first promise is resolved(rejected) in Promise.race?

本文关键字:promise 拒绝 是否 结束 执行 race 第一个      更新时间:2023-09-26

我不明白Promise.race的行为。它是否在promise数组中的第一个promise实例被解析(拒绝)后停止,而忽略所有其他的?

我的目标是执行数组中的所有承诺。按任何顺序执行,但必须全部执行。

一个例子。假设array_of_urls有10个url。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没有解释是全部执行还是全部停止:

race函数返回一个Promise,该Promise与第一个传递的Promise的结算方式相同。它解决或拒绝,无论哪个先发生。

乌利希期刊指南:

对不起,我没有解释清楚。我确实需要在一个数组中执行所有的承诺,但不是Promise.all的方式。是的,Promise.all执行所有,但它等待,直到所有的执行,收集他们的结果,然后返回一个数组与所有的结果在它。我需要调用一个特定的回调每当这10个中的一个被填满。这是不需要等待Promise.all收集它们的。

promise仅仅是异步操作的通知系统。它们根本不控制异步操作。实际上,情况正好相反,异步操作控制着承诺。因此,无论您使用Promise.race()还是Promise.all()或其他方案来处理承诺,都不会影响底层的异步操作。它只影响异步操作完成时收到的通知类型。

因此,当您使用Promise.all()时,当所有异步操作成功完成或有一个错误时,您会收到通知。如果其中一个出错,所有其他异步操作仍在运行,并将运行到正常完成。只有你的Promise.all(...).then()处理程序会受到影响。

当你使用Promise.race()时,你只是在第一个异步操作完成时得到一个通知。其他异步操作仍将运行到正常完成。

如果你想在每个单独的异步操作完成时得到通知,那么你只需将.then()处理程序附加到每个单独的承诺上,并且这些.then()处理程序完全不受你是否在承诺数组上也有Promise.all()Promise.race()的影响-这将只是另一个通知。

我发现最好将承诺视为异步操作的通知机制。一旦异步操作启动,它们根本不控制异步操作。相反,它们提供结构化的通知,告知异步操作完成后发生了什么。

//这里发生了什么?这个then回调会被调用10次吗还是只有一个?

承诺只解析或拒绝一次,所以你的Promise.all(...).then()Promise.race(...).then()处理程序将只被调用一次。

将承诺。竞速执行所有10个承诺,以任意顺序一个接一个,还是在第一次之后就停止了?

当你调用Promise.race()的时候,你的异步操作已经开始了,它们都已经在进行中。他们都将被处死。Promise.race()对异步操作本身的执行没有影响——它只是在第一个异步操作完成时提供一个通知。