CNode

关于async 返回值的问题

问答
Hhc2014发布于12 年前最后回复9 年前12 回复9965 浏览0 收藏

用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)

C
csrkernel#1·9 年前

我也有这个需求,在一个函数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... })

H
hc2014#3·12 年前
引用 Icego异步编程,用Callback啊 function HasRejectedTests( callback ){ async.series([ //又是一大推查询 ],function(err, ...

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

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

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

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

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

D
DevinXian#6·12 年前

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

A
alsotang#7·12 年前

用 eventproxy 会比 async 清晰: https://github.com/JacksonTian/eventproxy

H
hc2014#8·12 年前
引用 alsotang用 eventproxy 会比 async 清晰: https://github.com/JacksonTian/eventproxy

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

H
hc2014#9·12 年前

自己顶~

I
Icego#10·12 年前

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

P
pockry#11·12 年前

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

H
hc2014#12·12 年前
引用 pockryasync里面相对外部也是异步吧,你想办法把外面的挪到里面呗。

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

参与回复
登录后即可参与回复。登录