我正在尝试在 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/