Объединение массивов из нескольких http.requests в один массив - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь понять, почему не работает этот цикл https.requests.

Я пытаюсь делать 5 запросов http каждую минуту. Каждый http GET-запрос вызывает функцию processRequest () в качестве обратного вызова, и каждый processRequest () возвращает массив из запроса, давайте назовем его resultsArray. Я хотел бы иметь возможность создавать один массив или объект каждую минуту, который является объединением всех 5 "resultsArray" из 5 http-запросов, но у меня возникают проблемы с выяснением, как объявлять, какие переменные где. Вот что я попробовал:

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

Функция processRequest (), определенная в отдельном файле require ():

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 ]

1 голос
/ 11 октября 2019

Вы можете обернуть 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() или что-то в этом роде.

0 голосов
/ 11 октября 2019

Вы можете написать свою логику здесь, нет необходимости помещать 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, вам нужно использовать здесь обещания, как только вы закончите свсе запросы вы можете выполнить это обещание с помощью resultArray и можете использовать его после него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...