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