как вернуть два результата из обещания - PullRequest
1 голос
/ 29 февраля 2020

Я использую fetch для получения данных из двух разных API. Мне нужно использовать оба данных API в одной и той же функции. Один закончен намного быстрее, чем другой, поэтому, чтобы сделать эту работу, я использовал обещание. Все. Но теперь я застрял с двумя вопросами.

  1. Как я могу вернуть 2 результата (test1 и test2) следующему обещанию? Прямо сейчас мой код останавливается и говорит, что «test1 не определен».

  2. Если я использую promise.all и затем запускаю. json для каждого файла (как код ниже), будет ли код ждать каждого json до конца sh, прежде чем вернуть результат? Или можно не фини sh?

код:

Promise.all([fetch1, fetch2])
    .then((file) => {
      let test1 = file[0].json()
      let test2 = file[1].json()
      return ([test1, test2])
    }).then((data) => {
      console.log(test1)
      console.log(test2)
    })

1 Ответ

2 голосов
/ 29 февраля 2020

Вы можете вернуть Promise.all для обоих .json вызовов внутри .then:

Promise.all([fetch1, fetch2])
    .then((file) => {
      let test1 = file[0].json()
      let test2 = file[1].json()
      return Promise.all([test1, test2])
    }).then(([test1, test2]) => {
      console.log(test1)
      console.log(test2)
    })

Но, вероятно, было бы лучше принять оба fetch запроса и .map их их .json() Promises, затем вызов Promise.all по результату:

const getApi = url => fetch(url).then(res => res.json());
Promise.all([
  getApi('url1'),
  getApi('url2')
])
  .then(([test1, test2]) => {
    // do stuff with test1 and test2
  })
  .catch((err) => {
    // handle errors
  });

Приведенный выше код приведет к параллельной обработке запросов; ни один запрос не помешает другому запросу продолжить. Напротив, ваш (настроенный) исходный код потребует, чтобы заголовки ответа от обоих запросов были получены и обработаны до того, как .json() (для обработки тела) для любого из них может начаться.

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