每个asynchronous里面的nodejsasynchronous并行

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

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) }); 

正如你可以看到我正在尝试使用asynchronous模块填充对象。 当我在并行asynchronous控制台new_or_updated时,数组已经正确构build。 但是,当我发送variables到每个asynchronouscallback和控制它(结果variables),我得到未定义。 另外,当我在parentCallback中控制new_or_updated时,我只能得到数组中的一个元素(使用每个asynchronous模块的最后一个数组构造)。

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

根据asynchronous的代码库,“async.each”不是为了在callback中使用两个参数而devise的。

它总是会被调用,只有一个“err”(或者没有任何参数)callback参数。

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

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

返回到callback,..试试这个。 我正在使用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 ) }); 

我这样testing是工作

 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 ); } ); } );