簡體   English   中英

異步 javascript 承諾使用 settimeout 調用

[英]asynchronous javascript promises call with settimeout

我正在努力實現以下目標:

我有 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 塊內的主程序中沒有任何反應

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM