Как устранить ошибку undefined Promise - PullRequest
0 голосов
/ 17 июня 2020

В моем приложении React я загружаю API НАСА, чтобы получить фотографии Роверов. Чтобы позволить мне иметь лучшую структуру кода, я создал утилиту Promise с тайм-аутом, как показано ниже

export async function PromiseWithTimeout(promises, timeout) {
  let promise = promises;
  if (promises instanceof Array) promise = Promise.allSettled(promises).then(console.log);
  return Promise.race([promise, throwTimeout(timeout)]);
}

export const throwTimeout = (msec, message = 'timeout') => reject(msec, message);

export const reject = (msec, retVal) => new Promise((_, r) => setTimeout(r, msec, retVal));
export const resolve = (msec, retVal) => new Promise((r) => setTimeout(r, msec, retVal));

Результат этой утилиты в качестве примера из console.log следующий:

0: {status: "fulfilled", value: {…}}
1: {status: "fulfilled", value: {…}}
2: {status: "fulfilled", value: {…}}

У меня есть результат вызова указанной выше функции, которая используется следующим образом внутри компонента, но проблема в .then(), здесь я получаю, что forEach() не определено, и когда я console.log(rovers) === undefined I понятия не имею, что не так. Я получаю разрешение на выполнение своих обещаний, но я больше не вхожу в систему

componentDidMount = async () => {
    try {
      await PromiseWithTimeout(
        [
          getRoverManifest('curiosity'),
          getRoverManifest('opportunity'),
          getRoverManifest('spirit'),
        ],
        3000
      ).then(
        (rovers) => {
          rovers.forEach(savePhotosManifest);
          if (rovers.some((rover) => rover.photo_manifest === undefined))
            this.setState({ error: true, isLoading: false });

          this.setState({
            isLoading: false,
            rovers,
          });
        },
        (error) => {
          console.error('Error fetching Rover Manifests: ', error);
          this.setState({ error: true, isLoading: false });
        }
      );
    } catch (error) {
      console.error('Error Mars Rover Page: ', error);
      this.setState({
        error: true,
        isLoading: false,
      });
    }
  };

1 Ответ

0 голосов
/ 17 июня 2020

Вы должны вернуть result в блоке then из Promise.allSettled

Вот так

promise = Promise.allSettled(promises).then((res) => {
  console.log(res);
  return res;
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...