2017-04-08 33 views
0

我得到一个问题,如果我尝试多次使用请求,它不起作用。我可以举一个例子:Node JS:我如何从不同的网站请求多个源代码?

request('https://www.google.com', function (error, response, vBody1) { 
    request('https://www.purple.com', function (error, response, vBody2) { 
     request('https://www.stackoverflow.com', function (error, response, vBody3) { 
      console.log(vBody3); 
     }); 
     console.log(vBody2); 
    }); 
    console.log(vBody1); 
}); 

它读取并输出第一个站点的主体,但不是接下来的两个。 下面是另一个例子:

vSites = ['https://www.google.com','https://www.purple.com','https://www.stackoverflow.com']; 
for (i = 0; i < vSites.length; i++){ 
    request(vSites[i], function (error, response, vBody[i]) { 
     console.log(vBody[i]); 
    }); 
} 

这一个看起来比较清爽,我想这个版本,但它并没有在所有的工作。我究竟做错了什么?

回答

1

除了正确的解决方案,从Michael's reply,请注意for循环发送并行请求。如果您想要执行的操作超过console.log,则数据和错误处理可能会遇到挑战。

为了更好地处理请求,我建议使用异步控制库,如asyncbluebird。相比之下,async更容易理解,而bluebird提供更好的代码可读性。

下面是一个例子async实现:

var async = require('async'); 
var request = require('request'); 

var vSites = ['https://www.google.com', 'http://www.purple.com','https://www.stackoverflow.com']; 
async.map(
    vSites, 
    // `async` will call this function for each `vSite` 
    function(vSite, next) { 
    // Reuse the code inside your for-loop, but call `next` to pass the error and result to the final callback 
    request(vSite, function(err, response, vBody) { 
     next(err, vBody); 
    }); 
    }, 
    // The final callback will be executed when all requests are completed or either of them fails 
    function(err, results) { 
    console.log(err); 
    console.log(results); 
    } 
); 

希望这有助于:)

2

在您的循环版本中,您不需要vBody变量上的索引。

var request = require('request'); 
vSites = ['https://www.google.com','https://www.purple.com','https://www.stackoverflow.com']; 
for (i = 0; i < vSites.length; i++){ 
     request(vSites[i], function (error, response, vBody) { 
     console.log(vBody); 
    }); 
    } 

此代码工作正常,我在节点V4.3.2

相关问题