11
  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){
    });
  });

是否有某种方法可以使如果 function1 如果 booltest 评估为 true,则不要继续执行下一个输出“2”的函数?

4

4 回答 4

22

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

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

应该管用

于 2013-05-07T16:02:19.877 回答
2

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

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

检测(arr,迭代器,回调)

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

示例代码

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

您可以将它与您的 booltest 一起使用以获得您想要的结果。

于 2015-01-21T12:10:21.370 回答
1

为了使其合乎逻辑,您可以重命名errorerrorOrStop

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);
}
于 2014-06-08T20:40:09.393 回答
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
      }

    }
});
于 2015-06-10T21:34:22.547 回答