关于async 返回值的问题
发布于 6 年前 作者 hc2014 6972 次浏览 最后一次编辑是 4 年前 来自 问答

用async控制 数据库的查询,查询会很多 彼此之间有的有依赖关系有的没有,所以我再用的时候分了几个方法

exports.addTest=function(){
   async.waterfall([
   	//balabala的  这里是一大堆 查询
	//最后调用其他函数
	add()
   ])
}

function add(){
async.waterfall([
        function(cb) {
			//一个查询
        },
        function(n, cb) {	
             var results=HasRejectedTests(n,type,origrec)//这个地方取不到 HasRejectedTests的返回值
             console.log("res:"+results)
             cb(null,results);
        }
    ], function(err, results) {
		console.log(results)
    });
}

function HasRejectedTests(){
   async.series([
   //又是一大推查询
   ],function(err, results) {
      **想在这里返回数据 但是不能返回**
   }))
}

大概就是这样的结构, 我想在HasRejectedTests 中返回一个值给add(), 但是返回的是空,不知道怎么搞,懂的前辈 给讲解讲解呗

12 回复

@alsotang 看起来不错,稍后再去仔细看看,那,就async而言 在async的方法最后的function(err,results){}中 是可以直接console.log()出值的,但是为什么不能return 一个值呢? 有没有方法解决下的?

自己顶~

异步编程,用Callback啊 function HasRejectedTests(callback){ async.series([ //又是一大推查询 ],function(err, results) { 想在这里返回数据 但是不能返回 ** callback(results);** })) }

async里面相对外部也是异步吧,你想办法把外面的挪到里面呗。

@pockry 一直都在尝试这样弄,妈蛋 查询太多了 目前就写了十来个了,还有差不多十来个…

@Icego 给你点个赞,这种方法是可行的。但是呢?用一个问题,本来用asycn 就行想控制异步,把杂乱的深沉度嵌套 写的更优雅,更美观, 这样一搞,又写回去了。o(╯□╰)o

@hc2014 哈哈,你用async.waterfall,其实就可以达到目的的,前一个函数的输出作为下一个的输入,再好好研究研究吧!

@Icego 诶,三五个查询用这个解决当然不错。我这里一个功能十几二十个查询 用这个来写在一个方法里面 太过于拥挤了。 而且 这些、 sql查询里面很多是没有依赖关系的 但是又有一些有依赖关系, 所以我才把他们分开来写。待会再去琢磨琢磨

这时候eventproxy稍微比async好一点,这两者的API很有点不一样。

我也有这个需求,在一个函数checkDate内调用了async.waterfall(…)执行另外三个串行的判断函数,最后想给checkDate函数进行返回值,

checkDate(date, time) { var check; async.waterfall([ func1, func2, func3 ], function(err, result){ check = result }) }

由于nodejs异步的坑,上述操作无法实现,最后通过给checkDate加callback回调实现,如下:

checkDate(date, time, callback) { var check; async.waterfall([ func1, func2, func3 ], function(err, result){ callback(result); }) }

var status; checkDate(date, time, function(check){ status = check; //do something here… })

@hc2014 直接mysql查询方法封装成promise模块,就可以用同步的写法或者promise.all啦

回到顶部