一尘不染

nodejs循环中的多个http请求

node.js

我正在尝试在node中制作简单的feed阅读器,并且遇到了node.js中多个请求的问题。例如,我得到的表带有如下网址:

urls = [
"http://url1.com/rss.xml",
"http://url2.com",
"http://url3.com"];

现在,我想获取每个URL的内容。首先的想法是使用,for(var i in urls)但这不是一个好主意。最好的选择是异步执行,但我不知道如何制作。

有任何想法吗?

编辑:

我得到以下代码:

var data = [];
for(var i = 0; i<urls.length; i++){
    http.get(urls[i], function(response){
    console.log('Reponse: ', response.statusCode, ' from url: ', urls[i]);
    var body = '';
    response.on('data', function(chunk){
        body += chunk;
    });

    response.on('end', function() {
        data.push(body);
    });
}).on('error', function(e){
    console.log('Error: ', e.message);
});
}

问题在于,首先是循环中每个元素的调用行“ http.get
…”,并在该事件之后调用response.on(’data’),并在该response.on(’end’)之后。它弄得一团糟,我不知道该如何处理。


阅读 472

收藏
2020-07-07

共1个答案

一尘不染

默认情况下,节点http请求是异步的。您可以在代码中按顺序启动它们,并调用一个在所有请求完成后将启动的函数。您可以手动执行(计算已完成请求还是已启动请求),也可以使用async.js

这是无依赖方式(省略了错误检查):

var http = require('http');    
var urls = ["http://www.google.com", "http://www.example.com"];
var responses = [];
var completed_requests = 0;

for (i in urls) {
    http.get(urls[i], function(res) {
        responses.push(res);
        completed_requests++;
        if (completed_requests == urls.length) {
            // All download done, process responses array
            console.log(responses);
        }
    });
}
2020-07-07