как настроить функцию на ожидание повторных запросов REST

#javascript #node.js #rest

#javascript #node.js #rest

Вопрос:

Я хочу получить массив ключей от JIRA. Текущая функция работает, но когда я вызываю переменную pendingIssues в конце программы, она пуста, поскольку запрос еще не обработан функцией get_all_issues.

Как я могу изменить функцию, чтобы она ожидала запросов от функции, прежде чем запрашивать отложенные запросы.

код :

 var pendingIssues = [];

function get_all_issues() {

  console.log("Getting all JIRA issues...");

  var TotalIssues = 1000;
  var count_issue;
  var flag_no_more_issue = 0;


  for (count_issue = 0; count_issue < TotalIssues; count_issue =50){

    console.log(count_issue);

    //envoi de la requête
    jira.searchJira(searchString = 'project= PITM',
    optional ={
      startAt:count_issue,
      maxResults:50,
      fields:["key"],
      }).then(function(issues) {

      //Ensemble des tickets à traiter
      console.log('--------------------------- ');
      console.log(Date.now());
      var pas;
      for (pas = 0; pas < 50 amp;amp; flag_no_more_issue != 1 ; pas  ){
        if (issues.issues[0] != null){
          pendingIssues.push(issues.issues.pop().key)
          console.log(pendingIssues.length)
          //console.log(pas);
        }
        else{
          var flag_no_more_issue = 1;
          console.log('no more issue !')
        }
      }
      })
      .catch(function(err) {
        console.error(err);
      });
    }
  }


get_all_issues()
console.log('-----------------------------')
console.log(pendingIssues)  

Комментарии:

1. Вы программист на Python? Мы не так передаем параметры в js

Ответ №1:

Это происходит из-за выполняемого вами асинхронного кода. Вам нужно переместить свой console.log(pendingIssues) в свой then раздел (когда ваше обещание будет эффективно выполнено).

Или, что еще лучше, вы можете сделать из своей get_all_issues функции обещание, например:

 function get_all_issues() {
  return new Promise(function(resolve, reject) {
     // your JIRA request etc
     ...
     .then(function(issues){
       resolve(issues)
     })
     .catch(function(err){
       reject(err)
     })
  })
}
  

А затем используйте свое обещание следующим образом:

 get_all_issues.then(function(pendingIssues){
  console.log(pendingIssues)
})
  

Вы можете найти информацию об этом Promise здесь: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise

Ответ №2:

Соберите все запросы в массив, затем вы можете использовать Promise.all(requestArray).then(…) для выполнения некоторой логики после того, как все обещания будут выполнены.

Это может выглядеть следующим образом:

 for (count_issue = 0; count_issue < TotalIssues; count_issue =50){
  pendingIssues.push(
    jira.searchJira(
      'project= PITM',
      {
        startAt:count_issue,
        maxResults:50,
        fields:["key"],
      }).then(function(issues) {

        //Ensemble des tickets à traiter
        console.log('--------------------------- ');
        console.log(Date.now());
        var pas;
        for (pas = 0; pas < 50 amp;amp; flag_no_more_issue != 1 ; pas  ){
          if (issues.issues[0] != null){
            pendingIssues.push(issues.issues.pop().key)
            console.log(pendingIssues.length)
            //console.log(pas);
          }
          else{
            var flag_no_more_issue = 1;
            console.log('no more issue !')
          }
        }
      }).catch(function(err) {
        console.error(err);
      });
    }
  )
}

Promise.all(pendingIssues).then(res => console.log(res))