我正在努力解决为什么https.requests循环无法正常工作的问题。
我正在尝试每分钟发出5个http请求。每个http GET请求都将函数processRequest()作为回调函数调用,每个processRequest()都从请求中返回一个数组,我们将其称为resultArray。我希望能够每分钟产生一个数组或对象,这是所有5个对象的串联 来自5个http请求的“ resultsArray”,但是我很难弄清楚如何在哪里声明什么变量。这是我尝试过的:
CronJob:
var CronJob = require('cron').CronJob;
var tripDataFinal= new Object();
function makeRequest (){
var urlCounter = 0 ;
var feedsList = ["urlA", "urlB", "urlC", "urlD", "urlE"];
feedsList.forEach((feedToCheck,i)=>{
options = {
host: 'host',
path: feedToCheck
}
https.request(options, function(response){
processRequest(response, i, urlCounter, resultsArrayAll);}).on('error', (e) => {
console.log("Error!"); console.error(e);}).end();
})
}
new CronJob('* * * * * *', makeRequest
, null, true, 'America/New_York');
在单独的require()文件中定义的processRequest()函数:
module.exports = {
processRequest : function(response, feedNumber, urlCounter, tripDataFinal) {
urlCounter++;
//do stuff to 'response' to produce a result called resultsArray
resultsArrayAll["array"+urlCounter] = resultsArray;
console.log(urlCounter);
if (urlCounter == 5){
urlCounter = 0 ;
return concat(resultsArrayAll.array0
, resultsArrayAll.array1
, resultsArrayAll.array2
, resultsArrayAll.array3
, resultsArrayAll.array4);
}
else return resultsArrayAll;
}}
问题在于'urlCounter'(这是我对所请求的5个请求的计数方式)似乎未超过1。我做错了什么(也许有很多事情)?
谢谢
答案 0 :(得分:1)
您可以将http.request
包裹在Promise
中,然后执行Promise.all()
,如下所示:
function makeRequest (){
var urlCounter = 0 ;
var feedsList = ["urlA", "urlB", "urlC", "urlD", "urlE"];
var requestPromises = feedsList.map(function(url){
return new Promise(function (resolve, reject){
options = {
host: 'host',
path: feedToCheck
}
https.request(options, function(response){
resolve(response);
}).on('error', (e) => {
reject(e);
}).end();
});
});
Promise.all(requestPromises)
.then(function(resultsArray){
console.log('Results:', resultsArray);
})
.catch(function(e) { console.error(e); });
}
因此,在resultsArray
中,您将收到来自5个请求的5个响应(以发出请求的顺序),并且您可以在此处对它们进行任何操作,例如将数组传递给processRequest()
函数或其他东西。
答案 1 :(得分:0)
您可以在此处编写逻辑,而无需将urlCounter
内的processRequest
保留下来
var CronJob = require('cron').CronJob
function makeRequest () {
var urlCounter = 0
var feedsList = ['urlA', 'urlB', 'urlC', 'urlD', 'urlE']
var resultArray = []
feedsList.forEach((feedToCheck, i) => {
options = {
host: 'host',
path: feedToCheck
}
https.request(options, function (response) {
const result = processRequest(response) // do processing of response and returns a array
resultArray.concat(result) // concat all results here
})
})
}
new CronJob('* * * * * *', makeRequest, null, true, 'America/New_York')
如果您要使用简明的resultArray
,则在处理完所有请求后,需要在此处使用Promise,您可以使用resultArray
来解决该Promise,然后再使用它。