异步有条件 如何实现?async库可以实现吗
发布于 7 年前 作者 wdragon1983 3828 次浏览 来自 问答

假如在一个 回调函数里面 有一段 逻辑 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执行顺序链里面的。 应该是有问题的。 这样的情况应该怎么写?

6 回复

要结束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);
});
回到顶部