2014-11-10 2 views
1

У меня есть проблема с использованием Node JS при выполнении синхронных вызовов .. Вот моя проблема:Node JS Синхронного

Я следующий код:

async.doWhilst(function(callback) { 
    //some code 
    callback(); 
}, function() { 
    //make a database call and based on the results I should 
    //return true to continue looping or false to stop here 
}, function(err) { 
    //do some things when the loop finishes 
}) 

Проблемы при вызове базы данных это это асинхронный вызов, и цикл продолжается до того, как будет возвращено правильное значение.

Спасибо большое за ваши комментарии, я решил эту проблему путем перемещения вызова базы данных в коде цикла, как это:

var results = [] 
async.doWhilst(function(callback) { 
    //some code 
    sequelize.query('some query').success(function(result) { 
     results = result; 
     callback(); 
    }); 
}, function() { 
    //use the results variable that is fetched from the database 
    //return true to continue looping or false to stop here 
}, function(err) { 
    //do some things when the loop finishes 
}) 
+0

Тест-функция должна быть синхронной, было бы действительно, действительно, действительно плохо, чтобы попытаться ввести асинхронный код и какой-то цикл ожидания в нем. –

+0

Я попытался сделать это синхронным, но я не могу понять, как это проблема вызов базы данных зависит от изменения переменной в коде цикла. – Sami

+0

Вы не можете заставить операцию async вести себя синхронно. Ты просто не можешь. Он не имеет того же времени, что и синхронная операция, и его нельзя сделать. – jfriend00

ответ

0

У меня есть решила проблему, переместив вызов базы данных на код цикла следующим образом:

var results = [] 
async.doWhilst(function(callback) { 
    //some code 
    sequelize.query('some query').success(function(result) { 
     results = result; 
     callback(); 
    }); 
}, function() { 
    //use the results variable that is fetched from the database 
    //return true to continue looping or false to stop here 
}, function(err) { 
    //do some things when the loop finishes 
}) 
+0

Это не синхронный вызов базы данных. – lin

0

Надежда следующее может помочь:

(function iterate() { 
    executeDatabaseCall(..., function(e,r) { 
     if (...conditions to continue looping are verified...) 
     iterate(); 
     else 
     ...manage the end of loop... 
    }); 
})(); 
1

Вы можете имеют следующий результат:

return sequelize 
 
    .query("Database query here") 
 
    .success(function(result) { 
 
     //Do something with result here 
 
     else { 
 
      //Return error 
 
     } 
 
    });

0

Если вы действительно хотите использовать для синхронизации вызова, вы можете использовать эту библиотеку:

https://github.com/luciotato/waitfor

Это позволит вам будет сделать вызов с помощью синхронизации:

var syncDataReceived = wait.forMethod(collection,'insert',{data:toinsert});