2017-01-05 1 views
1

Хорошо, следующий код работает правильно для меня, это обычный способ выполнения асинхронных циклов (count is async). Таким образом, перед обратным вызовом я получаю 3 числа в журнале, в принципе разные.Асинхронный для цикла

var arrayIds = ['a', 'b', 'c']; 
var totalIds = arrayIds.length; 
var done = 0; 
var count = 0; 
for (var i = 0; i < arrayIds.length; i++) { 
    mongoose.Model.count({ 'likes.id': arrayIds[i] }, function (err, c) { 
     count += c; 
     console.log(c); 
     if (++done < totalIds) return; //else 
     callback(count); 
    }) 
} 

НО я не знаю, что происходит в этом другом случае, с той же философии, пожалуйста, помогите:

var arrayIds = ['a', 'b', 'c']; 
var totalIds = arrayIds.length; 
var done = 0; 
var likesPartial = []; 
for (var m = 0; m < arrayIds.length; m++) { 
    likesPartial.push(arrayIds[m]); 
    profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){ 
     console.log(u); 
     if (++done < totalIds) return; //else 
     callback(u); 
    }) 
} 

Проблема заключается в том, что я получаю те же 3 номера регистрируемые (с значение ожидаемого последнего 'u', которое было вызвано в конце), в то время как они должны в принципе быть разными, потому что likesPartial array имеет на каждом этапе различное количество элементов.

Два примера кажутся мне похожими, поэтому я не могу найти ошибку.

Спасибо.

+0

Я не знаю мангуста, но 'for' не может быть' async'. Вы можете просмотреть рекурсию для циклирования. – Rajesh

+0

Что вы хотите получить ** второй пример? –

+0

Строго говоря, я полагаю, вы имеете в виду «для не может иметь асинхронные функции внутри». в этом случае я говорю «нет». пример 1 работает. Я не уверен, что это лучший способ сделать что-то, но они могут быть сделаны таким образом. – sheriff

ответ

0

В вашем первом примере вы обновляете count с каждым обратным вызовом и, когда приходит последний обратный вызов, вы вызываете callback с окончательным результатом в count. Это имеет смысл.

Ваш второй пример заметно отличается: Он принимает несколько значений, но игнорирует все, кроме последнего, один (кроме их регистрации), а затем вызывает callback только с последней u он получает. Таким образом, предыдущие u s, которые он получил, выбрасываются, что сразу не имеет смысла (не в последнюю очередь потому, что вы не можете знать, какой из них u, если операция асинхронна, они могут быть выполнены в любом порядке).


Другая вещь, которую я отметил это:

profiles.count({ 'likes.id': { $in: likesPartial } }, function (err, u){ 
// ----------------------------^^^^^^^^^^^^^^^^^ 

Вы переходящим в массиве из каждый раз, в то время как в первом фрагменте кода, вы передаете один ID (arrayIds[i]), а не массив.

+0

Хорошо, они не совсем аналогичны. 2 значения u не возвращаются и не теряются В ЭТОМ УВАЖЕНИИ. Но в отношении журналов у меня должно быть 3 разных журнала в том же пути, что и в первом примере, не так ли? – sheriff

+0

@sheriff: Да. Это не означает, что они не могут произойти со всеми, имеют одинаковое значение. –

+0

@sheriff: Вы также передаете в вызов явно другой параметр, см. Обновление выше. –

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