7

async と request モジュールを一緒に使用しようとしていますが、コールバックがどのように渡されるのかわかりません。私のコードは

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 はあまり役に立ちませんでした。

4

2 に答える 2

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
    }
});
于 2012-06-16T12:36:09.933 に答える
3

あなたの例では、fetch関数は に最初のパラメーターとして渡された配列内のファイル名ごとに 1 回、3 回呼び出されますasync.map。2 番目のコールバック パラメータも に渡されfetchますが、そのコールバックは非同期フレームワークによって提供され、関数が作業を完了したときに呼び出す必要がありfetch、その結果を 2 番目のパラメータとしてそのコールバックに提供します。3 番目のパラメーターとして指定したコールバックは、3 つの呼び出し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>);
}, ...
于 2012-06-16T12:39:17.550 に答える