使用 nodejs 异步和请求模块

Posted

技术标签:

【中文标题】使用 nodejs 异步和请求模块【英文标题】:Using nodejs async and request module 【发布时间】:2012-06-19 06:01:22 【问题描述】:

我正在尝试同时使用异步和请求模块,但我不明白回调是如何传递的。我的代码是

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 帮不上什么忙。

【问题讨论】:

【参考方案1】:

Request 是异步函数,它不返回任何东西,当它的工作完成时,它会回调。从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
    
);

【讨论】:

代码工作并且很容易理解我现在做错了什么:)谢谢 您的示例链接没有显示任何回调。他们所做的只是登录到控制台。【参考方案2】:

在您的示例中,fetch 函数将被调用 3 次,对于作为第一个参数传递给 async.map 的数组中的每个文件名调用一次。第二个回调参数也将传递给fetch,但该回调由异步框架提供,您必须在fetch 函数完成其工作时调用它,并将其结果作为第二个参数提供给该回调。当所有三个 fetch 调用都调用了提供给它们的回调时,将调用您作为第三个参数提供给 async.map 的回调。

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

因此,要在代码中回答您的具体问题,您提供的回调函数将在所有请求结束时作为回调执行。如果您需要将回调传递给fetch,您可以这样做:

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

【讨论】:

以上是关于使用 nodejs 异步和请求模块的主要内容,如果未能解决你的问题,请参考以下文章

nodejs q模块

使用异步和请求包(NodeJS / Express)进行多个 API 调用

异步 nodejs 模块导出

带有异步请求的 NodeJS

nodejs中的多个异步mongo请求

Nodejs cluster模块深入探究