关于Nodejs async 返回值的问题
关于Nodejs async 返回值的问题
用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(), 但是返回的是空,不知道怎么搞,懂的前辈 给讲解讲解呗
当然可以。在你的代码中,async.waterfall
和 async.series
都是用来处理异步操作的,但它们的使用方式需要一些调整来确保你能够正确地传递返回值。我们可以通过调整你的代码结构来解决这个问题。
首先,让我们重新审视一下你的代码,并对其进行适当的修改:
修改后的代码
const async = require('async');
exports.addTest = function () {
async.waterfall([
// balabala 的 一大串查询
add
]);
};
function add(callback) {
async.waterfall([
function (cb) {
// 第一个查询
cb(null, 'some data');
},
function (n, cb) {
HasRejectedTests(n, 'type', 'origrec', function (err, results) {
if (err) return cb(err);
console.log("res:" + results);
cb(null, results);
});
}
], function (err, results) {
if (err) return console.error(err);
console.log(results);
});
}
function HasRejectedTests(n, type, origrec, callback) {
async.series([
function (cb) {
// 模拟第一个查询
setTimeout(() => {
cb(null, 'query result 1');
}, 1000);
},
function (cb) {
// 模拟第二个查询
setTimeout(() => {
cb(null, 'query result 2');
}, 1000);
}
], function (err, results) {
if (err) return callback(err);
console.log("HasRejectedTests results: ", results);
callback(null, results);
});
}
解释
-
回调函数的使用:
- 在
HasRejectedTests
函数中,我们使用了一个回调函数来传递结果。这是因为async.series
内部的每个任务都会调用一个回调函数来传递结果。 - 在
add
函数中,我们在HasRejectedTests
调用后使用了一个回调函数来接收HasRejectedTests
的返回值。
- 在
-
错误处理:
- 在
HasRejectedTests
和add
函数中,我们都添加了错误处理逻辑,以确保如果发生错误,我们可以及时捕获并处理它。
- 在
-
异步操作的顺序:
- 使用
async.waterfall
来确保异步操作按顺序执行。这样可以确保前一个操作的结果被传递到下一个操作中。
- 使用
通过这种方式,你可以确保在 HasRejectedTests
中获取的数据能够正确地传递到 add
函数中。希望这能帮助你解决问题!
用 eventproxy 会比 async 清晰: https://github.com/JacksonTian/eventproxy
自己顶~
异步编程,用Callback啊 function HasRejectedTests(callback){ async.series([ //又是一大推查询 ],function(err, results) { 想在这里返回数据 但是不能返回 ** callback(results);** })) }
async里面相对外部也是异步吧,你想办法把外面的挪到里面呗。
这时候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… })
在你的代码中,HasRejectedTests
函数内部使用了 async.series
来处理多个异步操作。你需要确保在 async.series
的回调函数中正确地返回结果。然后,你可以在 add
函数中正确处理这些结果。
以下是修改后的代码示例:
const async = require('async');
exports.addTest = function () {
async.waterfall([
// balabala 这里是一大堆查询
// 最后调用其他函数
add
]);
};
function add(cb) {
async.waterfall([
function (cb) {
// 一个查询
cb(null, 'some data');
},
function (n, cb) {
HasRejectedTests(n, type, origrec, (err, results) => {
if (err) return cb(err);
console.log("res:" + results);
cb(null, results);
});
}
], function (err, results) {
console.log(results);
});
}
function HasRejectedTests(n, type, origrec, cb) {
async.series([
// 又是一大推查询
function (callback) {
// 模拟一个查询
setTimeout(() => {
callback(null, 'query result 1');
}, 1000);
},
function (callback) {
// 模拟另一个查询
setTimeout(() => {
callback(null, 'query result 2');
}, 500);
}
], function (err, results) {
if (err) return cb(err);
// 返回查询结果
cb(null, results);
});
}
解释:
async.waterfall
: 在add
函数中使用async.waterfall
处理多个异步任务。HasRejectedTests
: 在HasRejectedTests
函数中,使用async.series
处理多个查询。每个查询完成后,调用callback
将结果传递给下一个函数。- 回调处理: 在
HasRejectedTests
的回调函数中,通过cb(null, results)
返回最终的结果。这样,你就可以在add
函数中获取到这些结果。
这样,你就可以正确地在 HasRejectedTests
中返回查询结果,并在 add
函数中获取到这些结果。