我正在循环一组试图获取其HTML的URL,但它仅适用于列表中的最后一个。 正如预期的那样,"尚未写入"控制台.log 会针对 urls 数组中的所有内容触发,但之后的 console.logs 只会对最后一个触发。 它们都是有效的 URL 和"res.on('error'....."不返回任何内容。
任何帮助将不胜感激!
for (var z in urls) {
var getURL = urls[z];
var copyURL = 'copies/'+getURL;
if (copyURL.indexOf('/') >= 0) {
var copyURLArr = copyURL.split('/');
} else {
var copyURLArr = [copyURL];
}
var copyFile = copyURLArr.pop();
var runningDirs = '';
for (var i in copyURLArr) {
if (runningDirs.length > 0) runningDirs += '/';
runningDirs += copyURLArr[i];
if (!require('fs').existsSync(runningDirs)) {
exec('mkdir '+runningDirs);
}
}
console.log('NOT WRITING YET: '+urlPrefix+getURL);
require('http').get(urlPrefix+getURL, function(res) {
console.log(urlPrefix+getURL);
res.on('data', function(data) {
console.log(copyURL);
require('fs').createWriteStream(copyURL, {flags:'a+'}).write(data);
});
});
}
在第 console.log(urlPrefix+getURL);
行中,值将始终用于最后一个 url,因为当调用回调时,这些变量的值将从上次分配它们的时间开始,这是循环中的最后一次迭代。
而是在单独的函数中发出请求,例如
function doRequest(url, copyURL) {
require('http').get(url, function(res) {
console.log(url);
res.on('data', function(data) {
console.log(copyURL);
require('fs').createWriteStream(copyURL, {flags:'a+'}).write(data);
});
});
}
然后用doRequest(urlPrefix+getURL, copyURL)
调用这个函数,然后检查问题是否仍然存在