javascript - Node.js - 使用请求在 for 循环中发送多个 HTTP GET

标签 javascript

我正在尝试在 for 循环中从我的 node.js 服务器(使用“request”包)发送多个 HTTP 请求。

这个想法基本上是拥有一个 URL 数组,为每个 URL 发送一个 HTTP get,并将响应存储在名为“responseArray”的数组中。

当我尝试这样做时,我得到“未定义”,但如果我将请求记录到 for 循环内的控制台,我知道这些请求正在工作。

function apiCalls() {

  var URLs = [‘URL1’, ‘URL2’, ‘URL3’];
  var responseArray = []
  for (var i = 0; i < URLs.length; i++) {
    request({
      url: URLs[i],
      method: 'GET',
      headers: {
        'Connection': 'close'
      },
    }, function(error, response, body) {
      if (error) {
        console.log(error);
      } else {
        responseArray.push(String(response.body));
        console.log(responseArray) // this is showing me all the data in the array correctly
        return responseArray;
      }
    }) //end request function
  } //end for loop
  console.log(responseArray)
} //end apiCalls function
apiCalls()

因此,在查看了有关堆栈溢出的一些不同解决方案之后,我尝试使用 Promise。我以前从未使用过它们,并且基于 google example

promise :

var apiCalls = new Promise(function(resolve, reject) {
  var URLs = [‘URL1’, ‘URL2’, ‘URL3’];
  var responseArray = [];
  for (var i = 0; i < URLs.length; i++) {
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
    request({
      url: URLs[i],
      method: 'GET',
      headers: {
        'Connection': 'close'
      },
    }, function(error, response, body) {
      if (error) {
        console.log(error);
      } else {
        resolve(responseArray.push(String(response.body))
      }
    }) //end request

  } //end for loop
})

apiCalls.then(function(result) {
  console.log('this is calling the promise')
  console.log(result)
}, function(err) {
  console.log(err)
});

当我尝试在 for 循环后记录 responseArray 时,我总是得到一个空数组。或者 - 如果我尝试将返回的数组分配给这样的变量,我会得到“未定义”:

var gimmeAllResponses = apiCalls();
console.log(gimmeAllResponses); //returns 'undefined'

谁能告诉我哪里错了? for 循环完成后如何更新“responseArray”数据?

最佳答案

这有点偏离,因为这需要替代包request-promise

你解决了很多次。由于您使用的是 Node.js,因此很可能可以使用 ES6 功能。使用 Array.prototype.map() 和 Promise.all():

var rp = require('request-promise');
var URLs = [‘URL1’, ‘URL2’, ‘URL3’];
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var responseArray = Promise.all(URLs.map((url) => rp({
  uri: url,
  method: 'GET',
  headers: {
    'Connection': 'close'
  }
}).then((error, response, body) => {
    if (error) {
      console.log(error);
    } else {
      return String(response.body);
    }
  })));

关于javascript - Node.js - 使用请求在 for 循环中发送多个 HTTP GET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43450359/

相关文章:

JavaScript 函数组织

javascript - Leaflet panTo(或setview)功能?

javascript - 如何使用 AngularJS ui-date 指令格式化初始日期值?

javascript - 如何模拟内容可编辑元素的可编辑点击

javascript - 网格内计算

javascript - 了解 Webpack 中的导入和导出

javascript - 使用 PHP mcrypt 加密后使用 Javascript CryptoJS 解密 AES

javascript - 还有其他方法可以重置字段吗

javascript - lambda 长深

javascript - 在一页中使用 jQuery datepicker 和多个 django 表单