2011-07-20 9 views
8

Tengo un bucle que tiene una llamada asincrónica dentro de él, con una devolución de llamada. Para poder continuar, necesito que la devolución de llamada se active durante todo el ciclo, para luego mostrar los resultados del ciclo.Node.js: esperando las devoluciones de llamada en un bucle antes de pasar a

Todo camino que he tratado de controlar esto no funciona (Paso han intentado, Tame.js, async.js, y otros) - ¿Alguna sugerencia sobre cómo avanzar?

array = ['test', 'of', 'file']; 
array2 = ['another', 'array']; 

for(i in array) { 
    item = array[i]; 
    document_ids = new Array(); 

    for (i2 in array2) { 
     item2 = array2[i2]; 
     // look it up 
     mongodb.find({item_name: item2}).toArray(function(err, documents { 
      // because of async, 
      // the code moves on and calls this back later 
      console.log('got id'); 
      document_ids.push(document_id); 
     })) 
    } 

    // use document_ids 
    console.log(document_ids); // shows [] 
    console.log('done'); 
} 

// shows: 
// [] 
// done 
// got id 
// got id 

Respuesta

10

Está registrando document_ids antes de que se activen las devoluciones de llamada. Debes realizar un seguimiento de la cantidad de devoluciones de llamada que has realizado para saber cuándo terminaste.

Un método fácil es utilizar un contador y verificar el recuento de cada devolución de llamada.

Tomando su ejemplo

var array = ['test', 'of', 'file']; 
var array2 = ['another', 'array']; 
var document_ids = []; 

var waiting = 0; 

for(i in array) { 
    item = array[i]; 

    for (i2 in array2) { 
     item2 = array2[i2]; 
     waiting ++; 

     mongodb.find({item_name: item2}).toArray(
      function(err, document_id) { 
       waiting --; 
       document_ids.push(document_id); 
       complete(); 
      }) 
     ); 
    } 
} 

function complete() { 
    if (!waiting) { 
     console.log(document_ids); 
     console.log('done');  
    } 
} 
+1

Muchas gracias! Modifiqué esto con la ayuda de async.js y lo puse en funcionamiento. –

Cuestiones relacionadas