繁体   English   中英

解决*和*拒绝Bluebird中的所有承诺

[英]Resolve *and* reject all promises in Bluebird

我正在寻找从promise数据中得到解决方案和拒绝的方法。 我目前依赖Bluebird实现,因此ES6兼容解决方案也适合。

想到的最好的事情就是使用Bluebird的Promise.settle ,我认为承诺检查是一个不必要的复杂问题:

  let promises = [
    Promise.resolve('resolved'),
    Promise.resolve('resolved'),
    Promise.reject('rejected')
  ];

  // is there an existing way to do this?
  let resolvedAndRejected = Promise.settle(promises)
  .then((inspections) => {
    let resolved = [];
    let rejected = [];

    inspections.forEach((inspection) => {
      if (inspection.isFulfilled())
        resolved.push(inspection.value());
      else if (inspection.isRejected())
        rejected.push(inspection.reason());
    });

    return [resolved, rejected];
  });

  resolvedAndRejected.spread((resolved, rejected) => {
    console.log(...resolved);
    console.error(...rejected);
  });

对于100%履行率不是选项或目标的情况来说,这似乎是一项微不足道的任务,但我甚至不知道食谱的名称。

是否有一种简洁且经过充分验证的方法来处理Bluebird或其他承诺实现 - 内置运算符或扩展?

OP提出补充完整性的答案。 这是我要做的:

 const res = Promise.all(promises.map(p => p.reflect())) // get promises
   .then(values => [
          values.filter(x => x.isFulfilled()).map(x => x.value()), // resolved
          values.filter(x => x.isRejected()).map(x => x.reason()) // rejected
   ]);

没有内置的东西,但reduce可以使它非常简洁:

Promise
  .settle(promises)
  .reduce(([resolved, rejected], inspection) => {
    if (inspection.isFulfilled())
      resolved.push(inspection.value());
    else
      rejected.push(inspection.reason());
    return [resolved, rejected];
  }, [[], []]);

您可以使用Promise.all() ,处理被拒绝的Promisereturn reason或其他值return到链接.then()

 let promises = [ Promise.resolve("resolved"), Promise.resolve("resolved"), Promise.reject("rejected") ] , results = {resolved:[], rejected:[]} , resolvedAndRejected = Promise.all( promises.map((p) => { return p.then((resolvedValue) => { results.resolved.push(resolvedValue); return resolvedValue }, (rejectedReason) => { results.rejected.push(rejectedReason); return rejectedReason }) })); resolvedAndRejected.then((data) => { console.log(data, results) }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM