我在快速js中使用异步库,并且在使用回调时正确使用其中两种方法存在问题。瀑布尽头的变量result3在其范围内完美无缺。但是,在需要将其发送到客户端的结果函数中,它是一个空白数组。提前谢谢。
async.waterfall(
[
function(callback) {
someQuery
callback(null,result1);
},
function(result1, callback) {
someQuery
callback(null,result2);
},
function(result2, mainCallback) {
async.forEachOf(result2, function (result, key, callback) {
request.query(
`SELECT * FROM tbl WHERE id = ${result.id};`,
function(err, recordset) {
result3 = recordset;
callback();
}
);
}, function (err) {
if (err) console.error(err.message);
mainCallback(null, result3);
});
}
],
function(err, result) {
console.log(result3);
res.send(
JSON.stringify({
result3
})
);
}
);
答案 0 :(得分:1)
你的result3
来自任务,它应该是瀑布回调的result
参数。
另一方面,如果切换到promises或async / await,这一切都会更容易。您正在使用哪个节点版本,以及为什么在有这么多其他可用选项时仍然使用回调模式
承诺的这个混乱可能被写为
somequery()
.then(someOtherQuery)
.then(someotherThing)
.then(Whatever)
.catch(your error here)
var result1 = await query1();
var result2 = await query2(result1);
var result3 = await query3(result2)
// do the rest of your stuff
关键是你应该重新考虑你的模式。它无缘无故地称为pyramid of doom
或callback hell