将来自多个http.requests的数组合并为一个数组

时间:2019-10-11 06:36:00

标签: javascript arrays node.js request

我正在努力解决为什么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。我做错了什么(也许有很多事情)?

谢谢

2 个答案:

答案 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,然后再使用它。