サーチ…
前書き
非同期コールバックを使用する場合、スコープを考慮する必要があります。 特にループ内にある場合。この簡単な記事では、何をしないかと簡単な実例を示します。
誤ったコードは、なぜこのキーの使用がバグにつながるのかを知ることができますか?
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