javascript - 异步 javascript promise 使用 settimeout 调用

标签 javascript jquery api asynchronous promise

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

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

  • 第一个 API 启动检索数据的作业并为其返回一个 ID
  • 第二个 API 通知我作业的状态(已完成、已取消...),我需要多次调用此 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 block 内的主程序中没有任何反应

最佳答案

您将需要 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 */)

关于javascript - 异步 javascript promise 使用 settimeout 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54808387/

相关文章:

javascript - i118next 初始化问题

ruby-on-rails - Rails 处理不同 Controller 客户端(Web、iOS API)的方式是什么?

jquery - History API html5,如何知道用户何时点击下一个/后退浏览器按钮?

php - 跨域安全地传输信息

javascript - 减少重复函数的 JavaScript 权重

javascript - ESLint 中的循环问题

Javascript 与 before() 和 after() 的混淆

javascript - C# 的 Jquery 效果

javascript - 删除表中的列 javascript

javascript - 如何更改所选行列数据表的字体颜色