サーチ…


前書き

非同期コールバックを使用する場合、スコープを考慮する必要があります。 特にループ内にある場合。この簡単な記事では、何をしないかと簡単な実例を示します。

誤ったコードは、なぜこのキーの使用がバグにつながるのかを知ることができますか?

var pipeline = {};
// (...) adding things in pipeline

for(var key in pipeline) {
  fs.stat(pipeline[key].path, function(err, stats) {
    if (err) {
      // clear that one
      delete pipeline[key];
      return;
    }
    // (...)
    pipeline[key].count++;
  });
} 

問題は、 varキーのインスタンスが1つしかないことです。すべてのコールバックは同じキーインスタンスを共有します。コールバックが発生する時点で、キーは増分されている可能性が高く、統計を受け取っている要素を指していない可能性があります。

正しい書き方

var pipeline = {};
// (...) adding things in pipeline

var processOneFile = function(key) {    
  fs.stat(pipeline[key].path, function(err, stats) {
    if (err) {
      // clear that one
      delete pipeline[key];
      return;
    }
    // (...)
    pipeline[key].count++;
  });
};
    
// verify it is not growing
for(var key in pipeline) {
  processOneFileInPipeline(key);
}

新しい関数を作成することによって、関数内でキーをスコープしているので、すべてのコールバックには独自のキーインスタンスがあります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow