我需要一次从几个网站下载很多文件,我有这个代码
var http = require('http');
var fs = require('fs');
var arr = ['http://www.bonyfarma.com/images/Bony%20Air.jpg', 'http://www.bonyfarma.com/images/Bony%20A-Booster.jpg'];
for (var i = arr.length - 1; i >= 0; i--) {
var file = fs.createWriteStream(arr[i].split('/').pop(-1).toLowerCase().replace("%20", "-"));
var request = http.get(arr[i], function(response) {
response.pipe(file);
});
};
但是,例如当我运行此代码时,第一个文件为空,只下载了第二个文件..你能帮我解决这个问题吗?
答案 0 :(得分:0)
var http = require('http');
var fs = require('fs');
var arr = ['http://www.bonyfarma.com/images/Bony%20Air.jpg', 'http://www.bonyfarma.com/images/Bony%20A-Booster.jpg'];
for (var i = arr.length - 1; i >= 0; i--) {
(function(url){
var file = fs.createWriteStream(url.split('/').pop(-1).toLowerCase().replace("%20", "-"));
http.get(url, function(response) {
response.pipe(file);
});
})(arr[i]);
};
答案 1 :(得分:0)
原因是您的file
变量在for
循环之外被提升。这导致所有响应都流向最后一个流创建。
解决这个问题的最简单方法是使用简单的Array.prototype.forEach
(节点支持这个)正确地确定var的范围:
arr.forEach(function(url) {
var file = fs.createWriteStream(url.split('/').pop(-1).toLowerCase().replace("%20", "-"));
var request = http.get(url, function(response) {
response.pipe(file);
});
});