Создание массива обещаний для нескольких запросов get - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть приложение Vue, которое в какой-то момент вызывает конечную точку API спортивных каналов, чтобы получить массив идентификаторов игр, чтобы я мог выполнять итерации по идентификаторам, чтобы получать баллы для отдельных игр.Итак, сначала в основном приложении я делаю:

// vue.js
         /* jshint ignore:start */
    axios
      .get(
        `https://api.mysportsfeeds.com/v1.2/pull/nba/${seasonName}/scoreboard.json?fordate=${
          date.yesterday
        }`,
        config
      )
      .then(async response => {
        this.sports_feeds_data = await response.data.scoreboard.gameScore;
        return this.sports_feeds_data;
      })
      .then(async response => {
        // Fill up array with all the game ID's for today's games
        // This will be used to retrieve the Box Scores later
        response.forEach(function(item, index) {
          gameIDs[index] = item.game.ID;
        });

        return gameIDs;
      })
      .then(response => {
        this.sports_feeds_boxscores = getBoxScores(response);
      })
      .catch(error => {
        console.log(error);
        this.errored = true;
      });
    /* jshint ignore:end */

    console.log("Here are boxScores" + this.sports_feeds_boxscores);================================================================================= //
    // ============================ End Get NBA Scores ================================= //
    // ================================================================================= //

Теперь в getBoxScores.js я хочу создать массив обещаний, а затем выполнять их по одному через axios.all (обещания) в массив boxscores.и вернуть его в Vue.js для дальнейшей обработки.Это выглядит так:

// getBoxScores.js

const axios = require("axios");

let boxScores = [];
let promises = [];

/* jshint ignore:start */
const getBoxScores = gameIDs => {
  console.log(gameIDs);
  gameIDs.forEach(function(item) {
    console.log(item); // nothing output
    console.log("Im in forEach"); // nothing output
    let myUrl = `https://api.mysportsfeeds.com/v1.2/pull/nba/2018-2019-regular/game_boxscore.json?gameid=${item}`;

    promises.push(
      axios({
        method: "get",
        headers: {
          Authorization:
            "Basic NzAxMzNkMmEtNzVmMi00MjdiLWI5ZDYtOTgyZTFhOnNwb3J0c2ZlZWRzMjAxOA=="
        },
        url: myUrl,
        params: {
          teamstats: "none",
          playerstats: "PTS,AST,REB,3PM",
          sort: "stats.PTS.D",
          limit: 3,
          force: true
        }
      })
    );
  });



    console.log(promises);
  axios.all(promises).then(function(results) {
    results.forEach(function(response) {
      boxScores.push(response.data.gameboxscore);
    });
    return boxScores;
  });
};
/* jshint ignore:end */

module.exports = getBoxScores;

Проблема: Обновление: смотри обещания [] нормально, но this.sports_feeds_boxscores по-прежнему отображается пустым при возврате getBoxScores (response).Есть идеи?Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

Когда вы извлекаете данные асинхронно, вам нужно продолжать работать с асинхронным шаблоном и не возвращаться к синхронным последовательностям.

Например, вы получаете синхронный доступ к gameIDs сразу после того, как запустил асинхронный запрос на его получение, поэтому он не будет работать: при выполнении boxScores(gameIDs); массив gameIDs еще не будет заполнен.

Поэтому ваш код должен быть организован следующим образом:

axios.get(url, config)
    .then(async response => { .... })
    .then(async response => { 
        .... 
        return gameIDs; // <-- better practice to drive the output through the chain
    })
    .then(boxScores); // <-- call it asynchronously!
    .catch(error => { ... });

// Whatever code comes here should not expect anything from the above 
// asynchronously retrieved data. It will not yet have been retrieved

Будьте осторожны с console.log: может сложиться неправильное впечатление, что ваши данные присутствуют в массиве во время создания журнала.Это не обязательно верно: консоль извлекает содержимое позже , в тот момент, когда вы расширяете массив в консоли.Это не всегда отражает ситуацию на момент создания журнала .

...