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”的下一个函数?
答案 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
}
}
});