#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) {}
});
}