从 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();