Как вызвать API для сообщений о состоянии других вызовов API прогресс - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь сделать два вызова API параллельно. Когда X вызывается, Y должен go параллельно, и он будет вызывать рекурсивно сам, пока не решится api X. два вызова вызывают мгновенное нажатие кнопки

function X () {
return new Promise((resolve,reject) => {
Service.requestAPI(RequestMethod.GET, API_URL.validateProductStatus)
      .then(response => {
resolve(response)
} 
}
}

function Y () {
Service.requestAPI(RequestMethod.GET, API_URL.validateProductStatus)
      .then(response => {
        if(response){
          setTimeout(() => {
            this.onStatusChange()
          },1000)
}
} 
}

async function buttonCLick() {
const XResponse = await X();
Y();
}

Приведенное выше решение не работает должным образом. Второй вызов Y становится син c вызовом вместо асин c. Куда я иду не так?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

await будет блокировать выполнение до тех пор, пока не будет разрешен X, одним из способов достижения этого является использование глобальной переменной, которая определяет, следует ли вызывать Y или нет:

let callY = true;

const x = () => {
  return new Promise((resolve, reject) => {
    // some api call
    setTimeout(() => resolve("X is reolved"), 3000);
  });
};

const y = () => {
  if (callY) {
    console.log("waiting for x");
    // some api call
    // once it resolves based on the response doing a recursive call
    setTimeout(() => y(), 1000); // calling the function after 3 seconds
  }
};

async function buttonCLick() {
  x().then(res => {
    console.log(res);
    callY = false;
  });
  
  y();
}

buttonCLick();
0 голосов
/ 30 марта 2020

Это то, что делает await, он ожидает завершения асинхронного c вызова, прежде чем возобновить. В вашем образце не хватает большого количества кода, чтобы предоставить решение, определяющее c для вашего варианта использования. Но в целом, чтобы выполнить асинхронную обработку c при обновлении статуса Dynami c, вам понадобятся либо обратные вызовы, либо поток.

let sleep = ms => new Promise(r => setTimeout(r, ms));

let doAsyncWork = async onProgress => {
  let n = 100;
  for (let i = 0; i < n; i++) {
    await sleep(Math.random() * 100);
    onProgress(i / n);
  }
  onProgress(1);
};

let updateProgress = progress => {
  document.querySelector('div').textContent = progress < 1 ? 
    `Working, ${progress * 100}%` :
    `Complete!`;
};

doAsyncWork(updateProgress);
<div></div>
...