как вызывать действие через каждые 2 минуты в reactjs с await

#javascript #reactjs #async-await #es6-promise

#javascript #reactjs #async-ожидание #es6-обещание

Вопрос:

Я использую async await для вызова API в react, мой вопрос в том, как я могу вызывать службу get каждые 2 минуты, потому что в моем случае promise не разрешает время, затрачиваемое на выполнение, и показывает состояние ожидания, поэтому я думаю вызывать службу get каждые 2 минуты, если обещание не выполнено. Может ли кто-нибудь подсказать мне, как я могу это сделать, используя await.

вот мой код, что я сделал.

 export function fetchUser(id) {
  return async dispatch => {
    let userUrl = FETCH_USER_URL   id;
    let response1 = await get(userUrl); // I want to call this again if response not getting within a 2 minutes

    if (response1.status === 200) {

       let processUrl = FETCH_PROCESS_USER_URL;
       let response2 = await get(processUrl);
    if (response2.status === 200) {
       console.log("fetch process user success");
    } else {
       console.log("fetch process user failed");
    }
      console.log("success");
    } else {
      console.log("failed");
    }
  };
}
  

буду признателен за любую помощь. Заранее спасибо

Комментарии:

1. 2 минуты — это долгое время для ожидания запроса. Вы уверены, что больше ничего не пошло не так?

2. нет, из серверной части они удерживают запрос до 3 минут. это наихудший сценарий ожидания до 3 минут, но я все еще хочу рассмотреть его, из-за этого я думаю вызвать службу через 2 или 1 минуту.

Ответ №1:

вы можете попробовать это

 const timeout = setTimeout(fetchUser(id), 120000);

let response = await get(url);

clearTimeout(timeout);
  

Редактировать из-за комментария:

 export function fetchUser(id) {
  return async dispatch => {
    let url = FETCH_USER_URL   id;
    const timeout = setTimeout(fetchUser(id), 120000); // start 2 min timer that will call the function again in 2 min

    let response = await get(url); // if response not getting within a 2 minutes call again

    clearTimeout(timeout); //remove it if you get a response before 2min


    if (response.status === 200) {

       let url2 = FETCH_PROCESS_USER_URL;
       let response2 = await get(url);
    if (response2.status === 200) {
       console.log("fetch process user success");
    } else {
       console.log("fetch process user failed");
    }
      console.log("success");
    } else {
      console.log("failed");
    }
  };
}
,,,
  

Комментарии:

1. Я обновил код, потому что то, что вы ответили, я не могу понять, поскольку я новичок в reactjs, можете ли вы просто посмотреть мой обновленный код, который я на самом деле делаю.

2. fetchUser() Я вызываю это действие в двух моих разных контейнерах. экспортируя его, но в своем ответе вы использовали по-другому, из-за этого я не могу понять. @linkinmedo

3. проверьте редактирование, я думаю, ваш код может быть намного чище, но я не знаю, что именно вы делаете, поэтому я ничего не изменил, кроме имен переменных, потому что не рекомендуется использовать одно и то же имя.

4. ok изменит имя переменной для более четкого понимания. Спасибо за ответ

5. спасибо, что уделили свое драгоценное время. @linkinmedo

Ответ №2:

Пожалуйста, попробуйте этот подход.

 const NUM_RETRIES = 3;

test();

async function getData() {
  let arr = new Array(NUM_RETRIES).map(() => null);
  arr.forEach(() => {
    try {
      await get('url');
    } catch (err) {}
  });
}