Перезапустите асинхронную функцию после прерывания извлечения API - PullRequest
0 голосов
/ 30 ноября 2018

Я создаю модуль 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;
  }
}

Это, очевидно, упрощенная версия, но по существу:

  • The getMetadata Функция получает массив remainingMovies из глобальной области.
  • Извлекает метаданные с сервера с помощью функции fetchMetadata.
  • Проверяет, истекло или нет соединение.
  • Если это произошло, следует перезапустить функцию и попытаться снова подключиться.
  • Если время не истекло, завершите for loop и продолжайте.

1 Ответ

0 голосов
/ 01 декабря 2018

Полагаю, вам нужно что-то похожее на скрипт ниже.Обработка ошибок с использованием try / catch для async / await, что, вероятно, является тем, что вы ищете в качестве отсутствующей головоломки.

async function getMetadata() {
  const remainingMovies = await getRemainingMovies();

  remainingMovies.map(movie => {
    try {
      return await fetchMetadata(movie);
    } catch (err) {
      return getMetadata();
    }
  });

}
...