Szukaj…


Wprowadzenie

Podczas korzystania z wywołania zwrotnego asynchronicznego należy wziąć pod uwagę zakres. Zwłaszcza jeśli wewnątrz pętli. Ten prosty artykuł pokazuje, czego nie należy robić, i prosty przykład roboczy.

Błędny kod, czy potrafisz dostrzec, dlaczego takie użycie klucza prowadzi do błędów?

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

Problem polega na tym, że istnieje tylko jedna instancja klucza var . Wszystkie wywołania zwrotne będą współużytkować tę samą kluczową instancję. W momencie uruchomienia wywołania zwrotnego klucz najprawdopodobniej został zwiększony i nie wskazuje elementu, dla którego otrzymujemy statystyki.

Prawidłowe pisanie

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

Tworząc nową funkcję, scopujemy klucz wewnątrz funkcji, aby wszystkie wywołania zwrotne miały własną instancję klucza.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow