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 值作为回调,而不是实际函数。