сделайте обещание.все ждут, пока оба API не будут выполнены, прежде чем он завершится

#reactjs #promise

#reactjs #обещание

Вопрос:

У меня есть профиль, который делает это..

 Promise.all([this.fetchInsights(), this.fetchTouchpoints()])
     .then(([insights, touchpoints]) =>
       console.log(insights, touchpoints)
     )
  

Вот fetchInsights()

 fetchInsights = () => {
  fetch('API_URL'   this.queryParams.custId   '/'   this.queryParams.acctNo, {
    method: 'GET', // or 'PUT'
    headers:{
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }
  }).then(res => res.json())
  .catch(error => console.error('Error:', error));
};
  

Вот fetchTouchpoints()

   fetchTouchpoints = () => {
    fetch('API_URL'   this.queryParams.custId   '/'   this.queryParams.acctNo, {
      method: 'GET', // or 'PUT'
      headers:{
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      }
    }).then(res2 => res2.json())
    .catch(error => console.error('Error:', error));
  };
  

Когда я запускаю это, страница сразу читается как неопределенная, undefined. Это связано с тем, что insights и точки соприкосновения не определены, поскольку вызовы API не завершены.

Когда я смотрю на журнал в Eclipse (это приложение Springboot), я вижу, что ответ является успешным, и он выводит ответ в консоль там… но приложение не обновляется.

Как я могу сделать так, чтобы Promise.all печатал журнал ПОСЛЕ выполнения обоих вызовов API?

Я попытался вставить Promise.all в componentDidMount и в render()

Любая помощь была бы высоко оценена!!

Комментарии:

1. Ваши fetchX функции не выполняют return обещания, которые они создают, поэтому Promise.all ничего не ждет.

Ответ №1:

Вы забыли вернуть обещания.

Кстати, для удобства чтения кода используйте строки шаблона

Вот исправленное fetchInsights :

 fetchInsights = () => {
  return fetch(`API_URL${this.queryParams.custId}/${this.queryParams.acctNo}`, {
    method: 'GET', // or 'PUT'
    headers:{
      'Content-Type': 'application/json',
      'Accept': 'application/json'
    }
  }).then(res => res.json())
  .catch(error => console.error('Error:', error));
};
  

Комментарии:

1. каков наилучший способ разделить ответы в Promise.all? вместо then ([1, 1]) как я могу выполнить первый ответ, а затем второй?

2. Если вы зависите от ответа первого, вы могли бы вызвать второй вместо .then первого. Или вы пишете асинхронную функцию и используете await fetch...