【问题标题】:nodejs async parallel inside an async eachnodejs异步并行在一个异步内部
【发布时间】:2017-05-27 03:22:19
【问题描述】:

首先,我是 nodejs 的新手。使用 API,我必须在每个循环中执行多个查询。所以,我开始使用带有 express 的异步模块。我使用的确切代码是

        new_or_updated = {};
        async.each(rows, function(e, callbackParent) {
            new_or_updated.id = e.id;
            async.parallel([
                function(callback){
                    db.query("SELECT sender_string FROM  filter_positive_rules_sender WHERE rule_id = ? AND is_deleted = 0", e.id,function(err, rows, fields){
                        if (err) {
                            return callback(err);
                        }
                        new_or_updated.sender = rows.map(x => x.sender_string);
                        callback(null);
                    });
                },
                function(callback){
                    db.query("SELECT subject_string FROM filter_positive_rules_subject WHERE rule_id =  ? AND is_deleted = 0", e.id ,function(err, rows, fields){
                        if (err) {
                            return callback(err);
                        }
                        new_or_updated.subject = rows.map(x => x.subject_string);
                        callback(null);
                    });  
                },
                function(callback){
                    db.query("SELECT body_string FROM filter_positive_rules_body WHERE rule_id = ?  AND is_deleted = 0", e.id ,function(err, rows, fields){
                        if (err) {
                            return callback(err);
                        }
                        new_or_updated.body = rows.map(x => x.body_string);
                        callback(null);
                    });
                }
            ],
            function(err) {
                if (err) {
                    res.status(500).json(
                        "Internal server error"
                    ).send();
                }
                console.log(new_or_updated):
                callbackParent(null, new_or_updated);
            });

        },
        function(err, result) {
            if (err) {
                res.status(500).json(
                    "Internal server error"
                ).send();
            }
            console.log(result)
        });

如您所见,我正在尝试使用异步模块填充对象。当我在并行异步中控制台 new_or_updated 时,数组已正确构建。但是,当我将变量发送到每个异步回调并对其进行控制台(结果变量)时,我得到未定义。此外,当我在 parentCallback 中控制台 new_or_updated 时,我只得到数组中的一个元素(使用每个异步模块构建的最后一个数组)。

我在这里做错了什么?有人可以向我解释一下嵌套异步实际上应该如何在实践中工作。

【问题讨论】:

  • 使用全局变量来存储值。尝试在执行异步操作的函数之外初始化变量
  • @ArUn new_or_updated 变量在两个异步之外初始化。
  • 你能在那个主函数之外初始化它并尝试
  • @ArUn 我做到了,但我仍然只得到最后一个结果。

标签: javascript node.js express asynchronous async.js


【解决方案1】:

根据 async 的代码库,“async.each”并非设计为在回调中采用两个参数。

它总是只用一个“err”(或不带任何参数)回调参数调用。

此外,在“async.each”操作中设置全局对象的属性时,会在任何异步操作的情况下覆盖该属性。这意味着在第一次迭代中设置的“new_or_updated.id”的值可能会被“async.each”的任何后续迭代覆盖。

所以理想情况下,这里的全局对象“new_or_updated”应该是一个对象数组,每个对象都有一些唯一的属性值。以便在“async.each”上保存每次迭代的值和上下文

【讨论】:

    【解决方案2】:

    返回回调,.. 试试这个。 我正在使用 async.map 和 async.waterfall 对不起,如果有错误和英语不好的危险,我只是一个初学者我只是一个学生。

    async.map(rows, function(e, callbackParent) {
        async.waterfall([
            function(callback){
                db.query("SELECT sender_string FROM  filter_positive_rules_sender WHERE rule_id = ? AND is_deleted = 0", e.id,function(err, rows, fields){
                    if (err) {
                        return callback(err);
                    }
                    e.sender = rows.map(x => x.sender_string);
                    callback(null, e );
                });
            },
            function(Obj, callback){
                db.query("SELECT subject_string FROM filter_positive_rules_subject WHERE rule_id =  ? AND is_deleted = 0", e.id ,function(err, rows, fields){
                    if (err) {
                        return callback(err);
                    }
                    Obj.subject = rows.map(x => x.subject_string);
                    callback(null, Obj);
                });
            },
            function(Obj, callback){
                db.query("SELECT body_string FROM filter_positive_rules_body WHERE rule_id = ?  AND is_deleted = 0", e.id ,function(err, rows, fields){
                    if (err) {
                        return callback(err);
                    }
                    Obj.body = rows.map(x => x.body_string);
                    callback(null, Obj);
                });
            }
        ],
        function(err, result) {
            callbackParent(err, result);
        });
    },
    function(err, result) {
        if (err) {
            res.status(500).json(
                "Internal server error"
            ).send();
        }
        res.send( result )
    });
    

    我这样测试是可行的

    function test( callback ) {
        callback( [
            {
                'name':'Anu'
            },
            {
                'name':'hem'
            }
        ] );
    }
    test( function( aaaaaaaaaaa ) {
        async.map( aaaaaaaaaaa, function( e, callbackParent ) {
            async.waterfall( [
                function( callback ) {
                    e.number = 123;
                    return callback( null, e );
                },
                function( obj, callback ) {
                    obj.kelas = '1';
                    return callback( null, obj );
                }
            ], function( eerr, r ) {
                callbackParent( eerr, r );
            } );
        }, function( erro, ok ) {
            res.send( ok );
        } );
    } );
    

    【讨论】:

      猜你喜欢
      • 2014-11-26
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2016-12-14
      • 2013-03-16
      • 2020-03-04
      相关资源
      最近更新 更多