7 votes

Utilisation de nodejs async et du module de requête

J'essaie d'utiliser async et le module de demande ensemble mais je ne comprends pas comment les callbacks sont passés. Mon code est le suivant

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

J'essaie de récupérer 3 fichiers dans l'ordre et de concaténer les résultats. Ma tête est coincée dans les callbacks que j'ai essayés et les différentes combinaisons auxquelles j'ai pu penser. Google n'a pas été d'une grande aide.

32voto

Mustafa Points 2782

La demande est une fonction asynchrone, elle ne renvoie rien, quand son travail est terminé, elle rappelle. À partir de exemples de demandes vous devriez faire quelque chose comme :

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

3voto

JohnnyHK Points 61191

Dans votre exemple, le fetch sera appelée trois fois, une fois pour chacun des noms de fichiers dans le tableau passé comme premier paramètre à la fonction async.map . Un deuxième paramètre de rappel sera également transmis à l'option fetch mais ce callback est fourni par le framework asynchrone et vous devez l'appeler lorsque votre fichier fetch a terminé son travail et fournit ses résultats à cette fonction de rappel en tant que deuxième paramètre. Le callback que vous fournissez comme troisième paramètre à la fonction async.map sera appelé lorsque les trois fetch ont appelé le numéro de rappel qui leur a été fourni.

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

Donc, pour répondre à votre question spécifique dans le code, la fonction de rappel que vous fournissez est exécutée comme un rappel à la fin de toutes les demandes. Si vous avez besoin de passer un callback à fetch vous feriez quelque chose comme ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X