1

最近、マングースの問題に遭遇しました。これが私のコードです:

var v, query;
for(var i=0; i<values.length; i++) {
    v = values[i];
    query = model.findOne({type:v});
    query.exec(function(err, doc) {
      if(doc == undefined) {
        var m = new model({type:v, count:0});
        // but the 'v' above is not the values[i] in the for loop
        // code to save comes here
      } else {
        doc.count++;
        // update code comes here
      }
    });
}

doc が null かどうかを確認し、null の場合はデータベースにデフォルト値を入力します。ドキュメントが返された場合は、そのプロパティを更新します。問題は、保存しようとしているオブジェクトのプロパティの 1 つとして値 [i] があることです。しかし、これはコールバックであるため、for ループにある特定の値は取得されません。

モデルの作成中にすべての異なる値のデフォルト オブジェクトを挿入することでこれを回避しましたが、コード フローのこの時点でこれを行う方法はありますか?

4

1 に答える 1

2

代わりにこれを試してください:

values.forEach(function(v) {
  var query = model.findOne({type:v});
  query.exec(function(err, doc) {
    if(doc == undefined) {
      var m = new model({type:v, count:0});
      // but the 'v' above is not the values[i] in the for loop
      // code to save comes here
    } else {
      doc.count++;
      // update code comes here
    }
  });
});

ループで機能しない理由forは、Javascript にブロック スコープがないためです。つまり、ブロック内でv参照される変数が再作成されるのではなく、再利用されます。

変数をすぐに使用する場合 (model.findOne({ type: v})それは問題ではありませんが、ループの終了後にコールバック関数query.execが (おそらく) 実行されるためv、コールバック内の変数にはループ内の最後の値のみが含まれvます。

を使用するforEachと、毎回新しい変数を作成できますv

于 2013-03-31T11:54:01.017 に答える