Перезапустите асинхронную функцию после прерывания извлечения API
Я создаю модуль Node.js, который берет список названий фильмов и получает их метаданные с сайта omdbapi.com.
Эти списки часто бывают очень большими, и иногда (с моим текущим медленным интернет-соединением) соединение прерывается из-за слишком большого количества одновременных соединений. Поэтому я настроил метод timeout/abort, который перезапускает процесс через 30 секунд.
Проблема, с которой я столкнулся, заключается в том, что всякий раз, когда я теряю подключение к Интернету или соединение прерывается, оно просто выходит из процесса и не перезапускает соединение.
Пример:
async function getMetadata () {
const remainingMovies = await getRemainingMovies();
for (let i = 0; i < remainingMovies.length;i++) {
const { data, didTimeout } = await fetchMetadata(remainingMovies[i]);
// Update "remainingMovies" Array...
if (didTimeout) {
getMetadata();
break;
}
}
if (!didTimeout) {
return data;
}
}
Это, очевидно, упрощенная версия, но по существу:
getMetadata
Функция получаетremainingMovies
Массив из глобальной области видимости.- Извлекает метаданные с сервера с помощью
fetchMetadata
Функция. - Проверяет, истекло ли время ожидания соединения.
- Если это произойдет, он должен перезапустить функцию и попытаться подключиться снова.
- Если время не истекло, закончите
for loop
и продолжай.
1 ответ
Я думаю, вы хотите что-то похожее на приведенный ниже скрипт. Обработка ошибок с использованием try/catch для async/await, что, вероятно, является тем, что вы ищете в качестве отсутствующей головоломки.
async function getMetadata() {
const remainingMovies = await getRemainingMovies();
remainingMovies.map(movie => {
try {
return await fetchMetadata(movie);
} catch (err) {
return getMetadata();
}
});
}