用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(), 但是返回的是空,不知道怎么搞,懂的前辈 给讲解讲解呗
用 eventproxy 会比 async 清晰: https://github.com/JacksonTian/eventproxy
@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啦