javascript-并行运行承诺,但单独处理拒绝

javascript-并行运行承诺,但单独处理拒绝,javascript,promise,bluebird,Javascript,Promise,Bluebird,我使用bluebird.jsmap函数对我使用的外部API执行并行请求。 每当任何内部承诺被拒绝时,map函数也会被拒绝(我知道这是出于设计)。 我想知道是否有任何方法可以并行地执行承诺,但要分别处理每一次拒绝,并且不辜负整个承诺 我想知道是否有任何方法可以并行地执行承诺,但要分别处理每一次拒绝,并且不辜负整个承诺 当然有-只需使用或: 另见一般情况 我想知道是否有任何方法可以并行地执行承诺,但要分别处理每一次拒绝,并且不辜负整个承诺 当然有-只需使用或: 另请参见概述。我将使用地图中的.ref

我使用
bluebird.js
map
函数对我使用的外部API执行并行请求。
每当任何内部承诺被拒绝时,
map
函数也会被拒绝(我知道这是出于设计)。
我想知道是否有任何方法可以并行地执行承诺,但要分别处理每一次拒绝,并且不辜负整个承诺

我想知道是否有任何方法可以并行地执行承诺,但要分别处理每一次拒绝,并且不辜负整个承诺

当然有-只需使用或:

另见一般情况

我想知道是否有任何方法可以并行地执行承诺,但要分别处理每一次拒绝,并且不辜负整个承诺

当然有-只需使用或:


另请参见概述。

我将使用地图中的
.reflect
,以获得承诺检查结果:

const all = Promise.map(items, item => doSomething(item).reflect());

all.then(items => {
  // will contain an array of the promises that fulfilled correctly
  let fulfilled = items.filter(x => x.isFulfilled()).map(x => x.value()));
  // will contain an array of the promises that rejected 
  // so you can handle the errors
  let rejected = items.filter(x => x.isRejected()).map(x => x.reason());

});

我将使用地图中的
.reflect
,以获得承诺检查结果:

const all = Promise.map(items, item => doSomething(item).reflect());

all.then(items => {
  // will contain an array of the promises that fulfilled correctly
  let fulfilled = items.filter(x => x.isFulfilled()).map(x => x.value()));
  // will contain an array of the promises that rejected 
  // so you can handle the errors
  let rejected = items.filter(x => x.isRejected()).map(x => x.reason());

});

如果没有任何带有纯ES6承诺的库,您可能会有这样的方法。在这种情况下,
promiseAll
函数将遵守已解决的承诺以及被拒绝的承诺

功能承诺(乐趣){
返回(数据)=>新承诺((解决,拒绝)=>乐趣(数据,(错误,恢复)=>错误?拒绝(错误):解决(恢复));
}
函数异步(数据、回调){
data.val+=“毫秒”;
Math.random()<0.5?setTimeout(=>callback(false,data.val),data.dur)
:setTimeout(=>callback(“error”),data.dur);
}
函数myNormalCallback(resultObject){
log(“承诺”+resultObject.count+“返回”+resultObject.result);
}
函数myErrorCallback(errorObject){
log(“承诺”+errorObject.count+“返回”+errorObject.error);
}
功能承诺人(proms){
返回新承诺((v,x)=>{var results=新数组(proms.length).fill(void 0);
proms=proms.map((prom,i)=>prom.then(res=>{results[i]=res;
结果:indexOf(void 0)==-1&&v(结果);
})
.catch(err=>{results[i]=err;
结果:indexOf(void 0)==-1&&v(结果);
}));
});
}
变量数据=[{val:100,dur:1000},{val:200,dur:2000},{val:300,dur:3000}],
proms=datas.map(数据=>promisify(异步)(数据));
promiseAll(proms).then(results=>results.map((res,i)=>res==“error”?myErrorCallback({count:i,error:res})

:myNormalCallback({count:i,res}))如果没有任何带有纯ES6的库,您可能会有这样一种方法。在这种情况下,
promiseAll
函数将遵守已解决的承诺以及被拒绝的承诺

功能承诺(乐趣){
返回(数据)=>新承诺((解决,拒绝)=>乐趣(数据,(错误,恢复)=>错误?拒绝(错误):解决(恢复));
}
函数异步(数据、回调){
data.val+=“毫秒”;
Math.random()<0.5?setTimeout(=>callback(false,data.val),data.dur)
:setTimeout(=>callback(“error”),data.dur);
}
函数myNormalCallback(resultObject){
log(“承诺”+resultObject.count+“返回”+resultObject.result);
}
函数myErrorCallback(errorObject){
log(“承诺”+errorObject.count+“返回”+errorObject.error);
}
功能承诺人(proms){
返回新承诺((v,x)=>{var results=新数组(proms.length).fill(void 0);
proms=proms.map((prom,i)=>prom.then(res=>{results[i]=res;
结果:indexOf(void 0)==-1&&v(结果);
})
.catch(err=>{results[i]=err;
结果:indexOf(void 0)==-1&&v(结果);
}));
});
}
变量数据=[{val:100,dur:1000},{val:200,dur:2000},{val:300,dur:3000}],
proms=datas.map(数据=>promisify(异步)(数据));
promiseAll(proms).then(results=>results.map((res,i)=>res==“error”?myErrorCallback({count:i,error:res})

:myNormalCallback({count:i,res}))通常的做法是将这些拒绝转换为具有标志值的解决方案。不过,我不知道蓝鸟的语义和语法。有了ES2015的承诺,它将只是
p=p.catch(函数(错误){return/*…表明此解决方案确实是一个错误的东西..*/;})
(在将
p
赋予
map
之前).@T.J.Crowder这是
。reflect
-添加了一个答案。通常的做法是将这些拒绝转换为带有标志值的决议。不过,我不知道蓝鸟的语义和语法。有了ES2015的承诺,它将只是
p=p.catch(函数(错误){return/*…表明此解决方案确实是一个错误的东西..*/;})
(在将
p
赋予
map
之前)。@T.J.Crowder它是
。reflect
-添加了一个答案。
Promise.map
不是标准api。请添加您用于承诺的npm软件包。@zoran404问题已标记,因此这就是我使用的。链接区中的答案