async.parallel问题

时间:2015-04-16 07:37:48

标签: node.js asynchronous

我相信这个问题是某个地方出现了异步流程和错误的并行工作......

所以,我有两个功能。第一个函数是更新数据库变量(主机,名称,登录,传递),它从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 ***

我正在等待测试'来到最后。我的逻辑是错误的,还是代码有问题?关心任何帮助。

1 个答案:

答案 0 :(得分:2)

您的async.parallel定义错误 - 主要是,当并行函数完成时应调用的回调是立即调用

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

相反,您必须将回调函数作为参数传递而不调用它:

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

回调的目的是async一旦确定所有并行功能都已完成就可以调用它。您的原始代码立即调用了回调函数,而async反而收到了该回调的返回值作为回调,而不是实际函数。