在promise .race中第一个promise被解析(拒绝)后执行是否结束
Does the execution finishes after the very first promise is resolved(rejected) in Promise.race?
我不明白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
是否有执行所有的方法?
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()
对异步操作本身的执行没有影响——它只是在第一个异步操作完成时提供一个通知。
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 在promise中为回调添加超时并拒绝
- angular ui bootstrap:当模式关闭时,promise被解析/拒绝
- JavaScript Promise 解析并拒绝函数调用序列
- 带有拒绝调用和抛出错误的Promise构造函数
- Bluebird Promise.any() 提前拒绝
- 节点 js,使用带有 Q promise 的猫鼬不调用拒绝函数
- 在ES6 Promise中允许多次解析/拒绝的原因是什么
- 拒绝promise时停止代码执行
- AngularJS/Karma-测试函数返回已解决或拒绝的promise
- 当你想要所有结果而不管是否被拒绝时,用什么代替Promise.all()
- Dojo.request.post-返回的promise说"拒绝”;,但服务器似乎已经接受了请求
- Bluebird Promise.all-多个承诺完成了成功和拒绝的汇总
- Angular-返回$modal promise并拒绝它
- node.js Q promise不会通过拒绝处理程序传播异常
- 当action使用promise时,indexOf拒绝在值突变中工作
- 的承诺.all - resolve回调会被触发,尽管Promise被拒绝
- 稍后在TypeScript中解析或拒绝Promise
- 在promise .race中第一个promise被解析(拒绝)后执行是否结束
- new Promise和Promise的区别.在bluebird中解决/拒绝