2015-04-16 1 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 может назвать его, как только он определяет, что все параллельные функции имеют Complet редактор Ваш исходный код сразу вызвал обратный вызов, а async вместо этого получил возвращаемое значение этого обратного вызова в качестве обратного вызова, а не фактическую функцию.

+0

хе, так легко)) спасибо большое – Lazyexpert

Смежные вопросы