如何修改Async Map代码实现带自定义请求头的多URL并行请求?
解决async.map批量带请求头下载URL的问题
嗨,这事儿不难,我来给你捋清楚!
你原来的代码里直接把request函数传给async.map,是因为request可以直接接收URL字符串作为参数发起GET请求,但要加自定义请求头的话,我们得给每个URL创建一个包含请求头的配置对象,而不是单纯传URL字符串。
只需要给async.map写一个包装函数,在里面处理每个URL的请求配置就行,修改后的代码如下:
var request = require('request'); var async = require('async'); var urls = ['http://myurl1.com', 'http://myurl2.com', 'http://myurl3.com']; // 自定义请求处理函数,给每个请求加上指定的请求头 function downloadWithHeaders(url, callback) { var requestOptions = { url: url, method: 'GET', // GET是默认值,也可以省略 headers: { 'x-url-key': 'myurlkey' } }; // 用配置对象发起请求,并把async的回调传递过去 request(requestOptions, callback); } async.map(urls, downloadWithHeaders, function(err, results) { if (err) throw(err); console.log(results.length); // 结果长度会和urls一致 });
关键点说明:
- 我们不再直接传
request给async.map,而是写了一个downloadWithHeaders函数作为中间层,这样就能给每个请求注入自定义的请求头配置 requestOptions里的headers字段就是你需要的请求头,注意键名的引号(如果有连字符的话必须加引号)- 最后把
async提供的callback传给request,确保异步流程能被async正确管理,错误和结果都能正常传递
如果之后你需要对每个请求的响应做额外处理(比如解析响应体),也可以在downloadWithHeaders的request回调里先处理,再调用callback返回结果~
内容的提问来源于stack exchange,提问作者Illusionist
相关产品推荐
相关产品推荐

