Axios случайное количество запросов - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно сделать несколько запросов с Axios, но я не знаю, сколько, количество запросов совершенно случайно, и это может быть 0 или 1 или 9182379, и после того, как все они сделаны, мне нужно что-то сделать, как сейчас Я должен обновить свое состояние (массив объектов).

Ты хоть представляешь, как я могу это сделать?

let oldTickets = [...this.state.playedTickets];
let length = oldTickets.length;
let newTickets = [];

for (let index = 0; index < length; index++) {
  let currentTicket = oldTickets[index];

  // just imported function that returns axios.get call
  checkTickets(currentTicket.ticketNumber)
    .then(data => {

      let newTicket = {
        bla: bla
      }

      newTickets.push(newTicket);
      this.setState({playedTickets: newTickets})

    })
    .catch(err => {
      console.log(err);
    })

}

Это работает нормально, но я знаю, что это не хорошо, поэтому я ищу лучшее решение!

1 Ответ

0 голосов
/ 14 мая 2018

после того, как они все сделали, мне нужно что-то сделать

Вы можете сопоставить массив с обещаниями и использовать Promise.all:

Promise.all( // executes all requests in parallel
  this.state.playedTickets.map(({ ticketNumber }) => checkTickets(ticketNumber))
).then(playedTickets => { // or declare function as `async` and use `await`
  // executed only after all requests resolved
  console.log('tickets', playedTickets); 
  this.setState({ playedTickets });
}).catch(e => console.log(e)); // executed as soon as one request fails

EDIT:

продолжить ожидание всех запросов, даже если некоторые не выполнены, и установить состояние на основе результатов успешных запросов

Для этого просто перехватите ошибку, прежде чем перейти к Promise.all:

Promise.all(
  this.state.playedTickets.map(({ ticketNumber }) =>
    checkTickets(ticketNumber).catch(console.log)
  )
).then(playedTickets => {
  console.log('tickets', playedTickets);
  this.setState({ playedTickets });
});

Неудачные запросы будут иметь значение undefined в массиве.
При необходимости вы можете отфильтровать их с помощью

const validTickets = playedTickets.filter(ticket => ticket !== undefined) 
...