2015-04-16 38 views
1

的問題,我相信的,是地方aroung異步流和不正確的並行工作對我來說...問題與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 *** 

,我是等待「只是爲了測試」來最後。我的邏輯錯了嗎,還是代碼有問題?任何幫助的問候。

回答

2

async.parallel定義是錯誤的 - 主要是,你的回調當並聯功能已完成應該被稱爲是立即稱爲:

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

相反,你必須通過回調函數作爲參數,而不調用它:

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

回調的目的是,一旦它確定所有的平行函數具有結束於async可以稱之爲編輯。您的原始代碼立即調用回調,而async取而代之的是將回調的返回值作爲回調接收,而不是實際的功能。

+0

嘿,那麼容易))非常感謝 – Lazyexpert