2016-05-19 10 views
0

ノードと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を使用する必要があり、これは2番目のパラメータとしてインデックスを返します。

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(query、update、callback)を呼び出すと、次のようになります。これは製品の配列に影響するため、indexOf()(存在しない可能性があります)を実行すると有効でないことがあります。ランクが時々入力されない理由があります。

+0

私は少し些細なもの私はそれがおそらく少し誤解していることを認識します。ループされた配列は別のソートされた配列でなければなりません – timhc22

+2

いずれにしても、indexOfではなくforEachOfを使用する必要があります - これは非同期ループ内のループなので - indexOfは大きなインデックスでも遅くなる –

+0

クールな感謝、私はそれを変更します! – timhc22

関連する問題