Асинхронный JavaScript обещает вызов с settimeout - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь добиться следующего:

У меня есть 3 APIS для вызова для получения данных:

  • первый 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 голосов
/ 21 февраля 2019

Вам понадобится 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 */)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...