Как правильно использовать Ax ios async / await, чтобы получить переменную из ответа? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать функцию сохранения для моей маленькой игры (Javascript, Ax ios, Express, NodeJS MongoDB). Проблема в том, что я не совсем понимаю обещания ax ios и функции async / await или, точнее, не знаю, как внедрить их в мой код. Я хочу получить данные из моего mongodb и использовать их в переменной / методе, чтобы я мог изменить статистику игрока и т. Д. c. позже по мере необходимости. Я читал все возможные руководства и подобные посты, но я понятия не имею, почему они не работают для меня. Буду признателен за любую помощь!

После того, как возиться и попробовать все, что я нашел в Интернете, вот часть моего кода:

case "Load":

   function getMySave () {
  return axios.get("http://localhost:3000/save", {
    params: {
        name: username
    }
  })
  .then(response => {
      console.log(response.data)
    return response.data
  })
  .catch(error => {
    console.log(error);
    return Promise.reject(error);
  });
}
const waitIgetMySave = async () => {
    const playerSave = await getMySave();
    return playerSave;
  };

  playerSave = (waitIgetMySave());
  console.log(playerSave)

player = new Player(username, playerSave.class, playerSave.health, playerSave.mana, playerSave.strength, playerSave.agility, playerSave.speed, playerSave.maxhp);

break;
            }

Но этот код просто возвращает следующее:

Promise {: "pending"}

Object {_id: "5e9945f238a82e084c7cb316", имя: "Jesse", класс: "Rogue", .....}

Так что сам объект работает нормально, но я не могу применить его ни к чему, кроме функции ax ios .get. Это всегда дает мне ожидающий, обещание [Объект], неопределенный или такой, который я не могу использовать в моем объекте игрока или переменных. Я совершенно уверен, что я делаю что-то не так с функциями async / await, но, потратив несколько дней на решение этой проблемы, у меня действительно заканчиваются варианты.

И да, я посмотрел в [ Как я могу вернуть ответ от асинхронного вызова?

[1]: Как я могу вернуть ответ от асинхронного вызова? но это, кажется, быть для Ajax, и я просто не понимаю и не реализую их в своем собственном коде.

1 Ответ

0 голосов
/ 20 апреля 2020

Ключевые принципы asyn c code

  • Невозможно сделать асинхронный код синхронным.
  • Promises - это инструменты для последовательного управления асинхронным кодом
  • Ключевые слова async и await являются инструментами для управления обещаниями таким образом, что выглядит синхронно (но на самом деле просто делает умные вещи с функциями, спящими в ожидании, и позволяющими остальной части программы продолжайте работу)

Указанная c проблема с вашим кодом

  • waitIgetMySave определена как async, поэтому она возвращает Обещание
  • Когда вы называете это (playerSave = (waitIgetMySave());), вы не await его, так что вы получаете обещание, а не разрешенное значение из обещания.

waitIgetMySave уйдет в сон в то время как он ожидает разрешения getMySave. Это позволяет остальной части программы продолжать работу, назначить обещание на playerSave и записать это обещание тем временем).

...