Sök…


Introduktion

När vi använder async återuppringning måste vi överväga omfattningen. Speciellt om det finns en slinga. Denna enkla artikel visar vad man inte ska göra och ett enkelt fungerande exempel.

Felaktig kod, kan du se varför denna användning av nyckel kommer att leda till buggar?

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

Problemet är att det bara finns ett exempel på var key . Alla återuppringningar delar samma nyckelinstans. Vid återuppringningen kommer nyckeln troligen att ha ökats och inte pekar på det element vi får statistiken för.

Rätt skrivning

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

Genom att skapa en ny funktion scopar vi nyckeln inuti en funktion så att alla återuppringningar har sin egen tangentinstans.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow