2012-06-16 14 views
7

Estoy tratando de usar async y solicitar módulo juntos, pero no entiendo cómo se pasan las devoluciones de llamada. Mi código esUsando nodejs async y módulo de solicitud

var fetch = function(file, cb) { 
    return request(file, cb); 
}; 

async.map(['file1', 'file2', 'file3'], fetch, function(err, resp, body) { 
    // is this function passed as an argument to _fetch_ 
    // or is it excecuted as a callback at the end of all the request? 
    // if so how do i pass a callback to the _fetch_ function 
    if(!err) console.log(body); 
}); 

Estoy tratando de buscar 3 archivos en orden y concatenar los resultados. Mi cabeza está atrapada en las devoluciones de llamadas que probé y las diferentes combinaciones que pude pensar. Google no fue de mucha ayuda.

Respuesta

32

La solicitud es una función asíncrona, no devuelve algo, cuando su trabajo está terminado, vuelve a llamar. De request examples, usted debe hacer algo como:

var fetch = function(file,cb){ 
    request.get(file, function(err,response,body){ 
      if (err){ 
       cb(err); 
      } else { 
       cb(null, body); // First param indicates error, null=> no error 
      } 
    }); 
} 
async.map(["file1", "file2", "file3"], fetch, function(err, results){ 
    if (err){ 
     // either file1, file2 or file3 has raised an error, so you should not use results and handle the error 
    } else { 
     // results[0] -> "file1" body 
     // results[1] -> "file2" body 
     // results[2] -> "file3" body 
    } 
}); 
+1

código de trabajo y muy fácil de entender lo que hice mal ahora :) gracias – andrei

+0

Su enlace con los ejemplos no muestra ningún devoluciones de llamada. Todo lo que hacen es iniciar sesión en la consola. – Catfish

3

En el ejemplo, la función fetch será llamado tres veces, una para cada uno de los nombres de archivo en la matriz pasada como primer parámetro a async.map. Un segundo parámetro de devolución de llamada también se pasará al fetch, pero esa devolución de llamada la proporciona el marco asíncrono y debe llamarlo cuando su función fetch haya completado su trabajo, proporcionando sus resultados a esa devolución de llamada como el segundo parámetro. Se llamará a la devolución de llamada que proporcione como el tercer parámetro al async.map cuando las tres llamadas fetch hayan llamado a la devolución de llamada que se les proporcionó.

Ver https://github.com/caolan/async#map

Así que para responder a su pregunta específica en el código, la función de devolución de llamada que proporcione se ejecuta como una devolución de llamada a continuación, poner fin a todas las peticiones. Si usted necesita para pasar una devolución de llamada a fetch que haría algo como esto:

async.map([['file1', 'file2', 'file3'], function(value, callback) { 
    fetch(value, <your result processing callback goes here>); 
}, ... 
Cuestiones relacionadas