有谁知道request模块支持什么事件吗?
模块的地址在这里https://github.com/request/request
问题是这样的,我写了一个zol壁纸下载器,使用async来控制并发,然后通过监听request的error
response
和end
的事件来控制下载的过程
我通过在end
事件里调用callback()
来通知async图片已经下载好了,并使用pipe()
方法来把图片存到本地
通过在error
事件里调用callback()
来通知async下载过程已经结束
问题在与,在出现网络错误的时候,会依次触发error
事件和end
事件,导致callback()
会被重复调用,这个问题该怎么办呢
部分代码在这里
function downloadImgs(callback, result) {
if (!fs.existsSync('download_pictures/')) {
fs.mkdirSync('download_pictures');
}
var img_urls = result['get_img_urls'];
var index = 0;
console.log('正在下载壁纸....');
async.eachLimit(img_urls, 5, function (item, callback) {
var request_stream = request({
url: item,
timeout: 5000,
headers: {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0'
}
});
request_stream.on('error', function (error) {
console.log('downloadImgs| 下载 ' + item + '失败| Error: ' + error);
callback();
});
request_stream.on('response', function (response) {
// 我也不知道有时候response为啥会为空,所以为了避免出现response为空的情况
// 我使用了事件监听的方式来处理数据
if (response.statusCode === 404) {
console.log('downloadImgs| 无效的下载地址 ' + item);
callback();
} else {
request_stream.pipe(fs.createWriteStream('download_pictures/number.jpg'.replace(/number/, index +'')));
index++;
// 通过设置end事件监听器,通知async已经完成了pipe方法
}
});
request_stream.on('end', function () {
callback();
});
}, function (error) {
console.log('所有壁纸下载完毕,请查看download_pictures文件夹');
})
}
2 回复
这个是报错信息(提示一下,end
事件原本会打印字符串end,现在已经被我取消掉了
downloadImgs| 无效的下载地址 http://b.zol-img.com.cn/desk/bizhi/image/6/1366x768/1436945611639.jpg
end
/home/tcstory/WebstormProjects/downloadpics/node_modules/async/lib/async.js:35
if (called) throw new Error("Callback was already called.");
^
Error: Callback was already called.
at /home/tcstory/WebstormProjects/downloadpics/node_modules/async/lib/async.js:35:31
at Request.<anonymous> (/home/tcstory/WebstormProjects/downloadpics/app.js:219:13)
at Request.emit (events.js:129:20)
at IncomingMessage.<anonymous> (/home/tcstory/WebstormProjects/downloadpics/node_modules/request/request.js:996:12)
at IncomingMessage.emit (events.js:129:20)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11)