Zoeken…


Invoering

Bij gebruik van async callback moeten we rekening houden met het bereik. Vooral als in een lus. Dit eenvoudige artikel laat zien wat u niet moet doen en een eenvoudig werkend voorbeeld.

Foutieve code, kun je zien waarom dit gebruik van sleutels tot bugs leidt?

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

Het probleem is dat er slechts één instantie van de var-sleutel is . Alle callbacks delen dezelfde sleutelexemplaar. Op het moment dat de callback wordt geactiveerd, is de sleutel hoogstwaarschijnlijk verhoogd en wijst deze niet op het element waarvoor we de statistieken ontvangen.

Correct schrijven

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

Door een nieuwe functie te maken, sleutelen we aan de sleutel binnen een functie, zodat alle terugbelopdrachten hun eigen toetsinstantie hebben.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow