Buscar..


Introducción

Cuando se utiliza la devolución de llamada asíncrona, debemos tener en cuenta el alcance. Especialmente si dentro de un bucle. Este artículo simple muestra qué no hacer y un ejemplo simple de trabajo.

Código erróneo, ¿puede detectar por qué este uso de la clave puede provocar errores?

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

El problema es que solo hay una instancia de la clave var . Todas las devoluciones de llamada compartirán la misma instancia de clave. En el momento en que se activará la devolución de llamada, lo más probable es que la clave se haya incrementado y no señale el elemento para el que estamos recibiendo las estadísticas.

Escritura correcta

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

Al crear una nueva función, estamos explorando la clave dentro de una función para que todos los callback tengan su propia instancia de clave.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow