Перезапустите асинхронную функцию после прерывания извлечения 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();
    }
  });

}
Другие вопросы по тегам