async.parallel 的问题
Issue with async.parallel
我认为问题出在异步流程和不正确的并行工作对我来说...
所以,我有两个功能。第一个函数是更新数据库变量(主机、名称、登录名、密码),它从 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));
}
第二个功能是为来自路由器的 mysql 查询提供服务。并且它必须在第一个功能完成后执行主要代码。代码:
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 ***
我在等待 'just for test' 排在最后。是我的逻辑错了,还是代码有问题?任何帮助的问候。
你的 async.parallel
定义是错误的 - 主要是,当并行函数完成时你应该调用的回调是 立即调用 :
async.parallel([
// Functions...
], whendone(null) /* <-- you are calling it right away! */)
相反,您必须将回调函数作为参数传递而不调用它:
async.parallel([
// Functions...
], whendone /* No invocation */)
回调的目的是async
一旦确定所有并行函数都已完成,就可以调用它。您的原始代码立即调用了回调,async
而是接收了该回调的 return 值作为回调,而不是实际函数。
我认为问题出在异步流程和不正确的并行工作对我来说...
所以,我有两个功能。第一个函数是更新数据库变量(主机、名称、登录名、密码),它从 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));
}
第二个功能是为来自路由器的 mysql 查询提供服务。并且它必须在第一个功能完成后执行主要代码。代码:
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 ***
我在等待 'just for test' 排在最后。是我的逻辑错了,还是代码有问题?任何帮助的问候。
你的 async.parallel
定义是错误的 - 主要是,当并行函数完成时你应该调用的回调是 立即调用 :
async.parallel([
// Functions...
], whendone(null) /* <-- you are calling it right away! */)
相反,您必须将回调函数作为参数传递而不调用它:
async.parallel([
// Functions...
], whendone /* No invocation */)
回调的目的是async
一旦确定所有并行函数都已完成,就可以调用它。您的原始代码立即调用了回调,async
而是接收了该回调的 return 值作为回调,而不是实际函数。