2015-07-13 4 views
0

Я пытаюсь выполнить цикл, в то время как подсчет некоторого массива меньше 50, или если цикл прошел более 14 итераций. Это похоже на идеальное использование для async.whilst.async.whilst с внутренним обратным вызовом

Однако мое усложнение заключается в том, что моя работа имеет асинхронный запрос внутри него (запрос базы данных).

Вот простой вариант моего кода:

var items = []; 
var key = 20150713; 
var iterations = 0; 

async.whilst(
    function(){ 
     return items.length < 50 || iterations < 14; 
    }, 
    function(callback){ 
     iterations+=1; 

     dbQuery("my query", function(err, res){ 
      key -=1; 
      //add res to items. 
      callback(); 
     }); 
    }, 
    function(err){ 

    });  

Конечно, этот код не работает, потому что dbQuery() возвращает немедленно, так async.whilst просто дует через 14 итераций и возвращает пустой массив, прежде чем первый dbQuery даже возвращается.

Как справиться с этим, чтобы async.whilst ожидал возврата внутренней функции перед запуском снова?

Или isync.whilst не подходит для моей задачи?

ответ

1

Вы используете его правильно. Только из кода, который вы публикуете, не похоже, что вы делаете что-либо с результатом:

async.whilst(
    function(){ 
     return items.length < 50 || iterations < 14; 
    }, 
    function(callback){ 
     iterations+=1; 

     dbQuery("my query", function(err, res){ 
      key -=1; 
      //add res to items. 
      callback(); 
     }); 
    }, 
    function(err){ 
     // this function will be called when whilst completes 
     // or when there's an error 

     if (!err) { 
      // use items: 
      console.log(items); 
     } 
     else { 
      console.log('OOps.. something went wrong somewhere'); 
     } 
    } 
); 
+0

Спасибо. Думал, что последняя функция была только для ошибок. –

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