异步JavaScript承诺使用settimeout

时间:2019-02-21 13:35:32

标签: javascript jquery api asynchronous promise

我正在努力实现以下目标:

我有3个APIS可以调用以检索数据:

  • 第一个API启动一个用于检索数据的作业,并为其返回一个ID
  • 第二个API通知我有关作业状态(已完成,已取消...),我需要对该API进行多次调用,然后才能调用下一个。
  • 第三个API是在工作完成后向我发送数据的那个API。

我遇到的问题是使用第二个API,我没有成功将数据发送回我的程序,这是我的代码:

function getJobId(token) {
  return  $.ajax({
    url:  "url" + token;
  });
}

function getJobStatus(job_id) {
  var url = "url" + job_id;
  return  $.ajax({
    url: url
  });
}

getJobStatus(job_id).then(function(response) {
  if (response.jobrun_status === "QUEUED" || response.jobrun_status === "INPROGRESS") {
    //setTimeout(recursiveJobIdCheck(job_id), 2000);
    recursiveJobIdCheck(job_id);
  } else {
    console.log(response.jobrun_status);
    return response.jobrun_status;
  }
});

我确实尝试在对第二个API的每次调用之间设置超时,但是没有成功,有人可以向我解释如何在保持每次请求调用之间的间隔直到完成工作的同时实现此目标。

谢谢。

编辑:我忘了在这里添加recursiveJobIdCheck函数

function recursiveJobIdCheck2(job_id) {
  return new Promise((resolve,reject) => {
    getJobStatus(job_id).then(function(response){
      if(response.jobrun_status === "QUEUED" || response.jobrun_status === "INPROGRESS"){
        //setTimeout(recursiveJobIdCheck(job_id), 2000);
        recursiveJobIdCheck2(job_id);
      }
      else{
        if(response.jobrun_status === "COMPLETED"){
        console.log(response.jobrun_status);
         resolve(response.jobrun_status);
         }
         else{
           reject(response.jobrun_status);
         }
      }
    });
  });
}

对api的调用在完成之前一直保持运行,当我通过Resolve函数返回值时,.then块内的主程序中没有任何反应

1 个答案:

答案 0 :(得分:1)

您将需要async/await来处理递归api调用以简化代码。

function getJobStatus(job_id){
  var url = "url" + job_id;
  return  $.ajax({
    url : url
  });
}

function queueNextCall () {
  return new Promise(function (resolve, reject) {
    setTimeout(resolve, 2000);
  });
}

async function recursiveJobIdCheck(job_id) {
  var response = await getJobStatus(job_id)
  if(response.jobrun_status === "QUEUED" || response.jobrun_status === "INPROGRESS"){
    await queueNextCall();
    return recursiveJobIdCheck(job_id)
  } else {
    console.log(response.jobrun_status);
    return response.jobrun_status;
  }
}

您要做的就是打电话

recursiveJobIdCheck(job_id).then(/* Success job function */)