Node.js http.get在循环中只获取最后一项

时间:2014-11-13 02:01:19

标签: javascript node.js http stream streaming

我循环尝试获取HTML的一组网址,但它只适用于列表中的最后一个。 "不写作"如预期的那样,console.log会触发urls数组中的所有内容,但是之后的console.logs只触发最后一个。它们都是有效的网址和" res.on('错误' ....."什么都不返回。

非常感谢任何帮助!

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);
        });
    });
}

1 个答案:

答案 0 :(得分:2)

在行console.log(urlPrefix+getURL);中,值始终为最后一个url,因为在调用回调时,这些变量的值将来自它们最后一次分配,这是循环中的最后一次迭代。 / p>

而是在一个单独的函数中发出请求,如

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)调用此函数,然后检查问题是否仍然存在