Как объединить цикл вызовов Axios с ожидаемой функцией? - PullRequest
2 голосов
/ 07 ноября 2019

Думаю, это сложно. Я запрашиваю у пользователя слово, которое я проверяю с помощью вызова API Axios. Как только проверка очищена, основной цикл моей игры - палач - начинается с ожидания между каждым ходом (отсюда и использование await).

Проблема: в текущей версии основной цикл игры (начинается после «как только проверка прошла, игра начинается ниже» комментарий) должна начинаться после проверки, когда на самом деле она начинается в одно и то же время, что все портит.

И я могуне помещать мой основной цикл в часть then() моего вызова Axios, потому что в этом случае вызов функции await-ed перестает работать.

Есть идеи, чтобы выйти из этого беспорядка?

    async startGameComputerGuesser () {
      var wordIsValidated = false
      const vm = this
      const dispatcher = {
        execute: function () {
          const wordApiBaseUrl = 'https://www.dictionaryapi.com/api/v1/references/sd4/xml'
          wordToGuess = prompt('Enter a word:').toLowerCase()
          const dispatcher = this
          vm.axios.get(`${wordApiBaseUrl}/${wordToGuess}?key=${wordApiKey}`).then(res => {
            if (!res.data.includes('def')) {
              dispatcher.execute()
            } else {
              wordIsValidated = true
            }
          })
        }
      }
      dispatcher.execute()

      // once validation clears, game starts below
      if (wordIsValidated) {
        while (!this.$store.state.gameIsOver) {
          await this.resolveAfter2Seconds()
          // main loop of the game goes here
        }
      }
    }

1 Ответ

2 голосов
/ 08 ноября 2019

используйте await внутри execute и возвращайте true / false, затем используйте while для проверки этого условия, как показано ниже

async startGameComputerGuesser() {
  let wordIsValidated = false;
  const vm = this;
  const dispatcher = {
    async execute() {
      const wordApiBaseUrl = 'https://www.dictionaryapi.com/api/v1/references/sd4/xml'
      const wordToGuess = prompt('Enter a word:').toLowerCase();
      const res = await vm.axios.get(`${wordApiBaseUrl}/${wordToGuess}?key=${wordApiKey}`);
      return res.data.includes('def');
    }
  }

  // validation
  while (!wordIsValidated) {
    wordIsValidated = await dispatcher.execute();
  }

  // game starts below
  while (!this.$store.state.gameIsOver) {
    await this.resolveAfter2Seconds()
    // main loop of the game goes here
  }
} 

Пример кода:

const startGameComputerGuesser = async function() {
  let wordIsValidated = false;
  
  const dispatcher = {
    async execute() {
      const res = await new Promise(res => setTimeout(() => res(Math.floor(Math.random() * 10)), 500));
      console.log(res);
      return res == 6;
    }
  }

  // validation
  while (!wordIsValidated) {
    wordIsValidated = await dispatcher.execute();
  }
  
  // once validation clears, game starts below
  console.log('started');
}

startGameComputerGuesser();
...