Recherche…


Introduction

Lorsque vous utilisez un rappel asynchrone, nous devons tenir compte de la portée. Surtout si dans une boucle. Cet article simple montre ce qu'il ne faut pas faire et un exemple de travail simple.

Code erroné, pouvez-vous savoir pourquoi cette utilisation de la clé entraînera des bogues?

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++;
  });
} 

Le problème est qu'il n'y a qu'une seule instance de la clé var . Tous les rappels partageront la même instance de clé. Au moment où le rappel se déclenchera, la clé aura probablement été incrémentée et ne pointera pas vers l'élément pour lequel nous recevons les statistiques.

Écriture correcte

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);
}

En créant une nouvelle fonction, nous définissons la clé dans une fonction afin que tous les rappels aient leur propre instance de clé.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow