我在Node和Mongo应用程序中有这个循环。 console.log
会输出所有'产品'但是,正确的名称,rank
通常在数据库中未正确设置。有趣的是,如果我在程序中放置一个调试断点并逐步完成,它就可以工作。知道是否存在某种竞争条件,以及做这项工作的最佳解决方案是什么?
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);
});
答案 0 :(得分: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(查询,更新,回调);这会影响products数组,因此当你执行indexOf()(可能不存在)时可能无效,这就是排名有时不填充的原因