2016-05-19 5 views
0

У меня есть эта петля в приложении Node и Mongo. console.log правильно выведет все «товарные» имена, однако rank обычно не устанавливается правильно в базе данных. Интересно, что если я поставил в программу контрольную точку отладки и медленно продвигаюсь, она работает. Любая идея, если есть какое-то состояние гонки, и какое лучшее решение для этой работы?Обновление NodeJS и MongoDB

async.each(sortedProductsArray, function (product, callback) { 
    console.log(product.name); 
    var query = { 
     productNo: product.productNo 
    }; 

    var index = sortedProductsArray.indexOf(product)+1; 
    var update = { 
     // give it a rank 
     $set: { 'rank': index } 
    }; 

    // main products array 
    products.update(query, update, callback); 
}); 

ответ

1

вы, вероятно, следует использовать forEachOf и это вернет индекс в качестве второго параметра, например:

async.forEachOf(['a', 'b', 'c'], function() {console.log(arguments)}); 

{ '0': 'a', '1': 0, '2': [Function] } { '0': 'b', '1': 1, '2': [Function] } { '0': 'c', '1': 2, '2': [Function] }

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

Редактировать:

при вызове products.update (запрос, обновление, обратный вызов); это влияет на массив продуктов, и поэтому может быть недействительным, когда вы делаете свой indexOf() (может и не существовать), поэтому рейтинг иногда не заполнен

+0

Я собираюсь изменить свой вопрос, потому что я упростил то, что у меня есть и я понимаю, что это, вероятно, немного вводит в заблуждение. Массив, который зацикливается, должен быть отдельным «отсортированным» массивом – timhc22

+2

в любом случае, вы все равно должны использовать forEachOf, а не indexOf, поскольку это петля внутри вашего асинхронного цикла, - indexOf также может быть медленным на больших индексах –

+0

круто спасибо, я это изменю! – timhc22

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

  • Нет связанных вопросов^_^