从 async.forEachOf 获取值以传递到 async.waterfall 的下一步
getting a value from async.forEachOf to pass into next step of async.waterfall
我在尝试从 async.forEachOf
内的查询中获取值时遇到问题,该查询根据 if 语句运行,因此我可以将该值传递到 async.waterfall
的下一步
代码如下:
async.waterfall([
function(callback) {
db.query('select id from topics where description = ?',
[topic], function(err, rows){
callback(err, rows);
});
},
function(rows, callback) {
var query = rows[0].id
db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder',
[query], function(err, rows){
callback(err, rows);
});
},
function(rows, callback){
var callbackRows = rows;
async.forEachOf(callbackRows, function(row, key, callback){
var topics
console.log('rows[key].id: ', callbackRows[key].id);
if (callbackRows[key].background == 0){
var query = callbackRows[key].id
db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder',
[query], function(err, rows){
callbackRows[key].subTopics = rows;
topics = callBackRows;
console.log('rows from async.forEach db query: ', rows);
console.log("from inside asnyc.foreach", callbackRows);
});
}
callback();
}, function(){
callback(null, topics);
console.log('forEachOf callback called');
});
// console.log(topics);
}
], function(err, topics){
console.log("from end of waterfall: ", topics);
});
我尝试了多种方法来做到这一点,我目前遇到的错误是 async.forEachOf
部分 [=19] 的 callback(null, topics)
行未定义主题=]
现在写的太累了,我要睡觉了。如果以后需要改进,我会注意的。同时,我要做的是将 async.forEachOf
末尾的查询结果附加到前面查询返回的值数组中的元素。从那里,我想将其发送到 express 中的响应对象中,在 async.waterfall
的结束回调中。
主题未定义,因为它既未在该函数的作用域中定义,也未在父函数的作用域中定义。在您的代码中,topics
是在 forEachOf 的迭代器函数内定义的。解决方案是简单地在父函数中定义主题,例如
function(rows, callback){
var callbackRows = rows;
var topics; // move the definition to here
async.forEachOf(callbackRows, function(row, key, callback){
您不需要 topics
。只需将 rows
传递到回调中即可。即 callback(null, rows);
在第三部分中,回调需要在数据查询完成后调用,但在 if 语句的 else 部分也需要调用,以确保它始终只调用一次。
if (callbackRows[key].background == 0){
var query = callbackRows[key].id
db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder',
[query], function(err, rows){
callbackRows[key].subTopics = rows;
topics = callBackRows;
console.log('rows from async.forEach db query: ', rows);
console.log("from inside asnyc.foreach", callbackRows);
callback();
});
} else callback();
我在尝试从 async.forEachOf
内的查询中获取值时遇到问题,该查询根据 if 语句运行,因此我可以将该值传递到 async.waterfall
的下一步
代码如下:
async.waterfall([
function(callback) {
db.query('select id from topics where description = ?',
[topic], function(err, rows){
callback(err, rows);
});
},
function(rows, callback) {
var query = rows[0].id
db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder',
[query], function(err, rows){
callback(err, rows);
});
},
function(rows, callback){
var callbackRows = rows;
async.forEachOf(callbackRows, function(row, key, callback){
var topics
console.log('rows[key].id: ', callbackRows[key].id);
if (callbackRows[key].background == 0){
var query = callbackRows[key].id
db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder',
[query], function(err, rows){
callbackRows[key].subTopics = rows;
topics = callBackRows;
console.log('rows from async.forEach db query: ', rows);
console.log("from inside asnyc.foreach", callbackRows);
});
}
callback();
}, function(){
callback(null, topics);
console.log('forEachOf callback called');
});
// console.log(topics);
}
], function(err, topics){
console.log("from end of waterfall: ", topics);
});
我尝试了多种方法来做到这一点,我目前遇到的错误是 async.forEachOf
部分 [=19] 的 callback(null, topics)
行未定义主题=]
现在写的太累了,我要睡觉了。如果以后需要改进,我会注意的。同时,我要做的是将 async.forEachOf
末尾的查询结果附加到前面查询返回的值数组中的元素。从那里,我想将其发送到 express 中的响应对象中,在 async.waterfall
的结束回调中。
主题未定义,因为它既未在该函数的作用域中定义,也未在父函数的作用域中定义。在您的代码中,topics
是在 forEachOf 的迭代器函数内定义的。解决方案是简单地在父函数中定义主题,例如
function(rows, callback){
var callbackRows = rows;
var topics; // move the definition to here
async.forEachOf(callbackRows, function(row, key, callback){
您不需要 topics
。只需将 rows
传递到回调中即可。即 callback(null, rows);
在第三部分中,回调需要在数据查询完成后调用,但在 if 语句的 else 部分也需要调用,以确保它始终只调用一次。
if (callbackRows[key].background == 0){
var query = callbackRows[key].id
db.query('select id, background, viewOrder, description from topics where parent = ? order by viewOrder',
[query], function(err, rows){
callbackRows[key].subTopics = rows;
topics = callBackRows;
console.log('rows from async.forEach db query: ', rows);
console.log("from inside asnyc.foreach", callbackRows);
callback();
});
} else callback();