Javascript: цикл API запросов

#javascript #api

Вопрос:

Учитывая следующий общедоступный запрос URL API (https://publicapi.schroders.com/schroders/external-production/public/api/v1/Contents/articles/search?Tag=economicviewsamp;PublishedFromDate=2020-07-01T00:00:00.000Zamp;TagType=Allamp;Language=enamp;AudienceId=110019) Мне нужно извлекать контент из нескольких AudienceId , и текущее ограничение заключается в том, что он принимает только идентификатор аудитории x1 на запрос, поэтому я подумал о создании массива значений идентификатора аудитории для итерации, но я немного затрудняюсь с тем, как объединить код.

   var today = new Date()
  var lastMonth = new Date(today)
      lastMonth.setDate(today.getDate() - 45)
  var formatLastMonth = formatDate (lastMonth, "%4Y-%2M--");
  var formatThisMonth = formatDate (today, "%Bl %4Y");
  var date = formatDate (today, "%4Y%2M");
  var time = "T00:00:00.000Z";
  var publishedFromDate = formatLastMonth   time;

  var base = 'https://publicapi.schroders.com/schroders/external-production/public/api/v1/Contents/articles/search'

  var params = {
    'PublishedFromDate': publishedFromDate.toString(),
    'TagType': 'All',
    'Language': 'en',
    'AudienceId': 110019
  };
  
  // then convert them to a URL format var1=1amp;var2=2
  var query = Object.keys(params)
      .map(function(k){ return k   '='   params[k] })
      .join('amp;');
  
  var url = base '?' query // https://publicapi.schroders.com/schroders/external-production/public/api/v1/Contents/articles/search?Tag=economicviewsamp;PublishedFromDate=2020-07-01T00:00:00.000Zamp;TagType=Allamp;Language=enamp;AudienceId=110019
  logInfo(url)
  var req = new HttpClientRequest(url);
  req.execute();
  var resp = req.response;
  var posts = JSON.parse(resp.body)  
  
  var articlesList_json=[];
  var i;
  //5 articles to pull
    for (i = 0; i < 5; i  ) {
      articlesList_json.push({
            "title":posts[i].title, 
            "pubDate":posts[i].publishedDate, 
            "link":posts[i].url, 
            "imageURL":posts[i].imageUrl, 
            "description": posts[i].description,
            "category": posts[i].category.name,
        });
    } 
 

Вот мой набор аудиторий

 var audience = {
                'C'   : 198147,
                'DFM' : 199083,
                'PC'  : 110019,
                'PA'  : 110019,
                'CI'  : 231752
               };
 

Как я могу изменить сценарий, чтобы он просматривал массив аудитории и каждый раз добавлял 5 статей в var articlesList_json=[]

Я также заметил, что мое приложение использует несколько разных функций для запроса, поэтому я заменил некоторые функции и попробовал их на своем jsfiddle https://jsfiddle.net/mh32rLg5/ судя по всему, он перебирает массив

fiddleloop

     var audience = {
                    'C'   : 198147,
                    'DFM' : 199083,
                    'PC'  : 110019,
                    'PA'  : 110019,
                    'CI'  : 231752
                   }; 
              
      
for (var i in audience) {
var aId = audience[i];
var url = 'https://publicapi.schroders.com/schroders/external-production/public/api/v1/Contents/articles/search?PublishedFromDate=2021-07-01amp;Language=enamp;AudienceId=' aId


  
    var xmlHttp;
    xmlHttp = new XMLHttpRequest(); 
    xmlHttp.onreadystatechange = function() {

            console.log(xmlHttp.responseText); // "" (empty string)
            var respData = JSON.parse(xmlHttp.responseText) || {};
            RemoteEvents = JSON.parse(respData.Description) || null;
        
    };
    xmlHttp.open( "GET", url, true );
    xmlHttp.send( null );


}
 

Ответ №1:

Ответ в JS

 var audience = {
    'C':  198147,
    'DFM':199083,
    'PC': 110019,
    'PA': 110019,
    'CI': 231752
};

        var articlesList_json = [];
        var i;

for (var i in audience) {
    
    var aId = audience[i];
    var url = 'https://publicapi.schroders.com/schroders/external-production/public/api/v1/Contents/articles/search?PublishedFromDate=2021-07-01T00:00:00.000Zamp;TagType=ALLamp;Language=enamp;AudienceId='   aId
    
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() {

//console.log(xmlHttp.readyState);// this always returns = 1
//console.log(xmlHttp.responseText) ; //this is always empty.
        
        if (xmlHttp.readyState == 4 amp;amp; xmlHttp.status == 200) {
            
        var respData = JSON.parse(xmlHttp.responseText)
        
            for (i = 0; i < 10; i  ) {
                articlesList_json.push({
                    "title": respData[i].title,
                    "pubDate": respData[i].publishedDate,
                    "link": respData[i].url,
                    "imageURL": respData[i].imageUrl,
                    "description": respData[i].description,
                    "category": respData[i].category.name,
                });
            }
   
        }

    }

    xmlHttp.open("GET", url, true);
    xmlHttp.setRequestHeader("Content-type", "application/json");
    xmlHttp.send(null);
    
}
   console.log(articlesList_json)