Suche…


Einführung

Bei der Verwendung von asynchronem Rückruf müssen wir den Umfang berücksichtigen. Besonders wenn in einer Schleife. Dieser einfache Artikel zeigt, was nicht zu tun ist, und ein einfaches Arbeitsbeispiel.

Fehlerhafter Code, können Sie erkennen, warum diese Verwendung des Schlüssels zu Fehlern führt?

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

Das Problem ist, dass es nur eine Instanz von var gibt . Alle Rückrufe teilen dieselbe Schlüsselinstanz. Zu dem Zeitpunkt, zu dem der Rückruf ausgelöst wird, wurde der Schlüssel höchstwahrscheinlich inkrementiert und zeigt nicht auf das Element, für das wir die Werte erhalten.

Korrektes Schreiben

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

Durch das Erstellen einer neuen Funktion wird der Schlüssel innerhalb einer Funktion festgelegt, sodass alle Rückrufe eine eigene Schlüsselinstanz haben.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow