问题与async.parallel

这个问题,我相信,是一个exceptionstream动和不正确的平行工作对我来说…

所以,我有两个function。 第一个函数是更新数据库variables(主机,名称,login,传递),它从leveldb获取这些值。 代码如下:

function refreshDbValues (whendone) { async.parallel([ function (callback) { db.get('dbhost', function (err, value) { if(err) callback(err); dbhost = value; console.log('host ' + dbhost); callback(null); }); }, function (callback) { db.get('dbname', function (err, value) { if(err) callback(err); dbname = value; callback(null); }); }, function (callback) { db.get('dblogin', function (err, value) { if(err) callback(err); dblogin = value; console.log('user ' + dblogin); callback(null); }); }, function (callback) { db.get('dbpass', function (err, value) { if(err) callback(err); dbpass = value; callback(null); }); }, ], whendone(null)); } 

第二个function是从路由器服务mysql查询。 第一个function完成后,必须执行主代码。 代码:

 function handle_database(query, callback) { refreshDbValues(function (err) { if(err) callback(err); console.log('just for test'); var pool = mysql.createPool({ connectionLimit : 100, //important host : dbhost, user : dblogin, password : dbpass, database : dbname, debug : false, multipleStatements: true }); pool.getConnection(function(err,connection){ if (err) { if(typeof(connection) != 'undefined') connection.release(); return callback(err); } connection.query(query,function (err, rows){ connection.release(); if(!err) return callback(null, rows); else console.log(err); }); connection.on('error', function(err) { return callback("Error in connection database"); }); }); }); } 

我的输出如下:

 just for test host *** user *** 

而我正在等待“只是为了testing”才最后到来。 我的逻辑错了吗,还是代码有问题? 关心任何帮助。

你的async.parallel定义是错误的 – 主要是,当并行函数完成时应该调用的callback立即调用

 async.parallel([ // Functions... ], whendone(null) /* <-- you are calling it right away! */) 

相反,您必须将callback函数作为parameter passing,而不必调用它:

 async.parallel([ // Functions... ], whendone /* No invocation */) 

callback的目的是,一旦确定所有的并行函数都完成, async可以调用它。 您的原始代码立即调用callback函数,而async代替callback函数的返回值,而不是实际的函数。