问题与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函数的返回值,而不是实际的函数。