Ricerca…


introduzione

Quando si utilizza la callback asincrona, è necessario considerare l'ambito. Soprattutto se all'interno di un ciclo. Questo semplice articolo mostra cosa non fare e un semplice esempio di lavoro.

Codice errato, puoi capire perché questo uso della chiave porterà a bug?

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

Il problema è che esiste una sola istanza della chiave var . Tutte le callback condivideranno la stessa istanza chiave. Nel momento in cui verrà attivato il callback, molto probabilmente la chiave sarà stata incrementata e non puntata all'elemento per il quale stiamo ricevendo le statistiche.

Scrittura corretta

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

Creando una nuova funzione, siamo la chiave scoping all'interno di una funzione in modo che tutti i callback abbiano la propria istanza chiave.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow