2012-06-16 1 views
7

Я пытаюсь использовать модуль async и request вместе, но я не понимаю, как передаются обратные вызовы. Мой код:Использование nodeyns async и модуль запроса

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

Я пытаюсь получить 3 файла в порядке и объединить результаты. Моя голова застряла в обратных вызовах, которые я пробовал, и о разных комбинациях, о которых я мог думать. Google не очень помог.

ответ

32

Запрос - это асинхронная функция, она ничего не возвращает, когда ее работа завершена, она перезванивает. От request examples, вы должны сделать что-то вроде:

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

код работает и очень легко понять, что я сделал неправильно сейчас :) спасибо – andrei

+0

Ваша ссылка на примеры не показывает никаких обратных вызовов. Все, что они делают, это войти в консоль. – Catfish

3

В вашем примере, функция fetch будет вызываться три раза, один раз для каждого из имен файлов в массиве, переданного в качестве первого параметра async.map. Второй параметр callback также будет передан в fetch, но этот обратный вызов предоставляется инфраструктурой async, и вы должны позвонить ему, когда ваша функция fetch завершила свою работу, предоставив ее результаты этому обратному вызову в качестве второго параметра. Обратный вызов, который вы предоставляете в качестве третьего параметра на async.map, будет вызываться, когда все три из звонков fetch вызывают обратный вызов, предоставленный им.

См https://github.com/caolan/async#map

Так, чтобы ответить на ваш конкретный вопрос в коде, функция обратного вызова вы предоставите выполнен в виде обратного вызова в то конец всех запросов. Если вам нужно передать обратный вызов fetch вы могли бы сделать что-то вроде этого:

async.map([['file1', 'file2', 'file3'], function(value, callback) { 
    fetch(value, <your result processing callback goes here>); 
}, ... 
Смежные вопросы