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