如何拒绝_.each循环中的Promise

时间:2017-09-07 06:53:55

标签: javascript promise lodash

如何拒绝来自_.each循环的承诺,它永远不会到达document.write('Failed');。在lodash中是否有更好的功能来处理这种情况。

function check(){
  return Promise
      .all(
    [
      Promise.resolve([1,3,4]),
      Promise.resolve([0,4,3]),
      Promise.resolve(undefined)
    ]).then(function(results){
      return _.each(results, function(result){
         return _.each(result, function(value) {
          // should reject when value is 0
          if(!value){
            return Promise.reject();
         }
        });
      });

    });
    }

check().then(function(){
    document.write('All Success');
    }, function(){
    // Never reaching this code.. :(
     document.write('Failed');
    });

以下是plnkr.co link

3 个答案:

答案 0 :(得分:2)

根据documentation_.each()函数返回第一个参数中的列表,并且不能被删除。

要实现您的目标,请尝试使用here所记录的for...of循环:

function check(){
  return Promise
      .all(
    [
      Promise.resolve([1,3,4]),
      Promise.resolve([0,4,3]),
      Promise.resolve(undefined)
    ]).then(function(results){
      for (let result of results) {
         for (let value of result) {
          // should reject when value is 0
          if(!value){
            return Promise.reject();
         }
        });
      });

    });
    }

check().then(function(){
    document.write('All Success');
    }, function(){
    // Never reaching this code.. :(
     document.write('Failed');
    });

如果您坚持使用_.each()循环,那么当它遇到第一次拒绝时,您永远无法摆脱循环,所以我不推荐这种方法。但是,您可以在最初包含已解析的promise的第一个循环之前声明一个变量,如果!value检查通过,则将其替换为被拒绝的promise,然后在最后一个循环结束后返回此变量{{ 1}}。

答案 1 :(得分:2)

您可以再次使用Promise.all,再加上flattenmap

function check(){
  return Promise
  .all(
    [
      Promise.resolve([1,3,4]),
      Promise.resolve([0,4,3]),
      Promise.resolve(undefined)
    ]).then(function(results){
      return Promise.all(_(results).flatten().map(result => {
        if(result === 0) return Promise.reject()
      }))
      
    });
}

check().then(function(){
    document.write('All Success');
     //lert("all success");
    }, function(){
     document.write('Failed');
    })
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.2/lodash.js"></script>

您也可以使用some

function(results){
  return Promise.all(results.map(result => {
    if([].concat(result).some(value => value === 0)) {
      return Promise.reject()
    }
}

答案 2 :(得分:2)

没有理由在then回调中创建新的承诺并将其返回。承诺的重点是允许您以更加同步的方式编写异步代码。办法。您在then回调中想要做的是抛出错误:

function check(){
  return Promise
      .all(
    [
      Promise.resolve([1,3,4]),
      Promise.resolve([0,4,3]),
      Promise.resolve(undefined)
    ]).then(function(results){
      return _.each(results, function(result){
         return _.each(result, function(value) {
          // should reject when value is 0
          if(!value){
            throw new Error();
         }
        });
      });

    });
    }

check().then(function(){
    document.write('All Success');
    }, function(){
    // Never reaching this code.. :(
     document.write('Failed');
    });

这将导致承诺链中的拒绝。