2013-11-10 2 views
1

спасибо за вашу помощь ... изо всех сил пытаюсь справиться с этим правильно. Сейчас я в асинхронном режиме, отказавшись от своей способности правильно писать обратные вызовы. У меня есть фрагмент, где я передаю набор случайных чисел (каждый реестр) и передавая их на вызов мангуста. Попытка создать набор данных из нескольких запросов, которые я передаю.Ошибка синхронизации потока данных Async node.js

Моя проблема заключается в том, что независимо от того, что я сделал в течение 4 часов, переменная «newarray» всегда пуста.

Спасибо за вашу помощь -

async.forEach(arLimit, function(eachrecord, callback){ 

    newarray = new Array; 

    var query = UGC_DB_Model.find({}).skip(eachrecord).limit(-1); 

    query.execFind(function (err, data) { 
    if (err) 
     console.log(err); 
    else { 
     newarray.push(data); 
    } 
    }); 

    callback(null, newarray); 

}, function(err, result) { 
    if (err) return next(err); 
     console.log("(it's empty): " + result); 
}); 

ответ

2

Есть несколько проблем с вашим кодом:

  • async.forEach не означает «генерировать» результаты, вот что async.map для;
  • необходимо вызвать обратный вызов только после завершения execFind, а не сразу после его вызова;
  • Ваш newarray, вероятно, не нужен;

Так что попробуйте вместо этого:

async.map(arLimit, function(eachrecord, callback){ 

    var query = UGC_DB_Model.find({}).skip(eachrecord).limit(-1); 

    query.execFind(function (err, data) { 
    if (err) 
     callback(err); // pass error along 
    else { 
     callback(null, [ data ]); 
     // although I think you mean this (because 'data' is probably an array already) 
     // callback(null, data); 
    } 
    }); 

}, function(err, result) { 
    if (err) return next(err); 
    console.log("(it's empty): " + result); 
}); 
+0

Да, подключи и играй! Раньше я не использовал карту, намного проще, когда я мог играть с вашим примером. Обратный вызов был полным мозговым пердуном. Спасибо много! – chuckjones242

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