假如在一个 回调函数里面 有一段 逻辑
async.waterfall([
function(cb){
//查询用户表
dbDAO.select(usersql,function(err,users){
cb(err,results);
});
},function(results,cb){
if(A){
dbDAO.select(dogSql,function(err,users){
if(B){
执行代码快C
}else{
结束此次async
}
cb(err,results);
});
}else{
执行代码快C
cb(err,results);
}
}
],function(err,results){
//查到狗狗了,可以牵出来了
})
问题就是如果满足A 才执行一个异步方法,而异步方法返回里面根据返回结果判定是否执行 逻辑C 如果不满足条件A就不执行异步方法,直接执行逻辑C。
这样如果用上面的写法。A里面的异步方法其实不是在整个async执行顺序链里面的。 应该是有问题的。 这样的情况应该怎么写?
没有看懂
要结束async链直接return callback(null, result, …)就好了
@Bingmang
dbDAO.select(dogSql,function(err,users){
if(B){
执行代码快C
}else{
结束此次async
}
cb(err,results);
});
这段代码是异步的。没办法结束async。
因为这个异步代码 不在 async链里面 。
即时在回调里面 结束链。 但是代码其实已经往下走了。
@htoooth 主要表达意思就是 在异步调用里面有一个 方法。需要判断条件 然后执行代码。如果条件满足,他还要执行一个异步操作。根据操作判断是否结束整个异步链。如果不符合判断条件,直接走下面逻辑。
关键的问题是 在异步链里面的方法,需要判断条件才能决定是否执行另一个异步操作。 这样就不能把这个异步操作 放到异步链里面了。
何必纠结,就用回调地狱
那种写法呗,嵌套不多的话问题不大
var p = Promise.resolve();
if (A) {
p = dbDAO.select(dogSql);
}
p.then(function (users) {
if (users) {
// 处理满足A条件的逻辑
}
return cb(err, results);
});