Axios зацикливает обещания и обновляет данные предыдущих ответов Axios - PullRequest
0 голосов
/ 02 июля 2018

Как я могу дождаться разрешения всех обещаний, чтобы обновить response.data первого вызова ajax? (пример использования swapi.co api)

Простая экспресс-оболочка .get. Каждый / звездолет перечисляет ресурс пилотов (см. Комментарий внутри). Я хочу иметь полные данные пилотов в моей оболочке /api/starships.

app.get('/api/starships/', function(req, res){
axios.get('https://swapi.co/api/starships')
 .then(function(response){
    // res.setHeader('Cache-Control', 'no-control');
    //  pilots: [
    //    "https://swapi.co/api/people/13/",
    //    "https://swapi.co/api/people/14/",
    //    "https://swapi.co/api/people/25/",
    //    "https://swapi.co/api/people/31/"
    // ],
    response.data.results.forEach(function(starship, i){
      if (starship.pilots) {
          var promises = [];
          var fullpillots = [];
          starship.pilots.forEach(function(pilot_info, i){
            promises.push(axios.get(pilot_info))
          })

          axios.all(promises).then(function(results) {
              var fullpillots_info = [];
              results.forEach(function(value, i){
                fullpillots_info.push(value.data)
              })
              // ??? how to update 1 response.data with  fullpillots_info
              starship.fullpillots_info = fullpillots_info;
          });
      } else {
          console.log("No pilots")
      }
    });

    res.json(response.data);
})
.catch(function(error){
  console.log({"error": error})
})
});

1 Ответ

0 голосов
/ 02 июля 2018

выглядит примерно так. Но ваш function(starship, i){... не будет автоматически ждать ваших обещаний, он будет перемещаться по этому forEach, прежде чем вы сможете мигать, и отправит ответ, пока он не будет готов.

Вам нужно сделать starshipPromises и нажать обещание от axios.all(...., А затем что-то вроде

axios
  .all(starshipPromises)
  .then((starhips)=>{ 
     res.json(starships);
  }); 

Вот полная версия async / await, если это возможно:

app.get('/api/starships/', async function(req, res){

  const starships = (await axios.get('https://swapi.co/api/starships')).data.results;
  for (let starship of starships) {
    starship.fullpillots_info = [];
    for (let pilot of starship.pilots) {
      starship.fullpillots_info.push( (await axios.get(pilot)).data );
    }
  }
  res.json(starships);

});
...