从async.forEachOf获取值以传递到async.waterfall

时间:2015-09-12 05:09:59

标签: node.js asynchronous async.js

我在尝试从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);
});

我已经尝试过多种方式,我目前得到的错误是callback(null, topics)部分的async.forEachOf行没有定义主题< / p>

此刻写得更多太累了,我要去睡觉了。如果以后需要改进,我会看到它。与此同时,我要做的是将async.forEachOf末尾的查询结果追加到前一个查询返回的值数组中的元素。从那里开始,我想把它放在快递中的响应对象中,在async.waterfall的结束回调中。

3 个答案:

答案 0 :(得分:0)

主题未定义,因为它未在函数的作用域或父函数的作用域中定义。在您的代码中,topics在forEachOf的迭代器函数内定义。解决方案是简单地在父函数中定义主题,例如

function(rows, callback){
        var callbackRows = rows;
        var topics; // move the definition to here
        async.forEachOf(callbackRows, function(row, key, callback){

答案 1 :(得分:0)

您不需要topics。只需将rows传递给回调即可。即callback(null, rows);

答案 2 :(得分:0)

在第三部分中,一旦数据查询完成,就需要调用回调,但也需要在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();