有没有办法在nodejs中停止执行async系列的下一个函数?

时间:2013-05-07 15:55:13

标签: node.js async.js

  async.map(list, function(object, callback) {
    async.series([
      function(callback) {
        console.log("1");

        var booltest = false;
        // assuming some logic is performed that may or may not change booltest
        if(booltest) {
            // finish this current function, move on to next function in series
        } else {
           // stop here and just die, dont move on to the next function in the series
        }

        callback(null, 'one');
      },
      function(callback) {
        console.log("2");
        callback(null, 'two');
      }
    ],
    function(err, done){
    });
  });

是否存在某种方式,如果函数1如果booltest的计算结果为true,请不要继续执行输出“2”的下一个函数?

4 个答案:

答案 0 :(得分:21)

如果使用true作为错误参数回调,流将停止,所以基本上

if (booltest)
     callback(null, 'one');
else
     callback(true);

应该工作

答案 1 :(得分:2)

我认为您正在寻找的功能是async.detect而不是map。

来自https://github.com/caolan/async#detect

  

detect(arr,iterator,callback)

     

返回arr中传递异步真值测试的第一个值。该   迭代器是并行应用的,意味着要返回的第一个迭代器   true将使用该结果触发检测回调。这意味着   结果可能不是原始arr中的第一项(就...而言)   通过测试的订单。

示例代码

async.detect(['file1','file2','file3'], fs.exists, function(result){
    // result now equals the first file in the list that exists
});

你可以用你的booltest来获得你想要的结果。

答案 2 :(得分:1)

为了使其符合逻辑,您可以将error重命名为errorOrStop

var test = [1,2,3];

test.forEach( function(value) {
    async.series([
        function(callback){ something1(i, callback) },
        function(callback){ something2(i, callback) }
    ],
    function(errorOrStop) {
        if (errorOrStop) {
            if (errorOrStop instanceof Error) throw errorOrStop;
            else return;  // stops async for this index of `test`
        }
        console.log("done!");
    });
});

function something1(i, callback) {
    var stop = i<2;
    callback(stop);
}

function something2(i, callback) {
    var error = (i>2) ? new Error("poof") : null;
    callback(error);
}

答案 3 :(得分:0)

我传递一个对象来区分错误和功能。看起来像:

function logAppStatus(status, cb){
  if(status == 'on'){
    console.log('app is on');
    cb(null, status);
  }
  else{
    cb({'status' : 'functionality', 'message': 'app is turned off'}) // <-- object 
  }
}

随后:

async.waterfall([
    getAppStatus,
    logAppStatus,
    checkStop
], function (error) {
    if (error) {
      if(error.status == 'error'){ // <-- if it's an actual error
        console.log(error.message);
      }
      else if(error.status == 'functionality'){ <-- if it's just functionality
        return
      }

    }
});