如何启用功能以等待REST请求

时间:2019-03-08 15:59:23

标签: 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 && 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)

2 个答案:

答案 0 :(得分:1)

这是因为您执行了异步代码。 您需要将console.log(pendingIssues)移至then部分(有效解决Promise之后)。

或者更好的是,您可以将get_all_issues函数设置为Promise,如下所示:

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

然后像这样使用您的Promise:

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

您可以在以下位置找到有关Promise的信息:https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Promise

答案 1 :(得分:0)

将所有请求收集到一个数组中,然后您可以使用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 && 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))