0

我遇到一个问题,如果我尝试多次使用请求,它就不起作用。我可以举个例子:

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

这个看起来更干净,我想要这个版本,但它根本不起作用。我究竟做错了什么?

4

2 回答 2

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 上对我来说很好用

于 2017-04-08T01:41:56.343 回答
1

除了迈克尔回复中的正确解决方案之外,请注意 for 循环并行发送请求。如果您想做的不仅仅是console.log.

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

下面是一个示例异步实现:

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

希望这可以帮助 :)

于 2017-04-08T03:45:58.080 回答