Phaser / TypeError: Невозможно прочитать свойство 'then' из неопределенного - PullRequest
0 голосов
/ 05 июля 2018

В моей игре я хочу сохранить обновленную оценку от пользователя, а затем извлечь рейтинг из БД. Я понял, что обещания - это путь, и я уже пробовал много ответов здесь о переполнении стека, но я не могу понять, почему я получаю следующую ошибку:

TypeError: Невозможно прочитать свойство 'then' из неопределенного

С помощью этой функции я обновляю счет для пользователя:

saveScoreOnDb: function () {
    var self = this;

    if(!this.scoreUpdated && (this.score > this.game.global.currentUser.high_score)){
        // do this just once
        this.scoreUpdated = true;

        return new Promise(function (resolve, reject) {
            // save current score on Db
            var xhttp = new XMLHttpRequest();
            xhttp.open("PUT", "https://myproject.herokuapp.com/api/users/" + self.game.global.currentUser.id, true);
            xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
            var input = JSON.stringify({
                'high_score': self.score
            });

            xhttp.onload = function(){
                if (xhttp.readyState == XMLHttpRequest.DONE && xhttp.status == 200){
                    console.log('resolved the savetoDB thingy');
                    resolve(xhttp.response);
                }
            };
            xhttp.onerror = function(){
                reject(xhttp.statusText);
            };

            xhttp.send(input);
        });
    } else {
        self.getRankingFromDb();
    }
}

В другой функции внутри переключателя я вызываю функцию с таким кодом:

this.saveScoreOnDb().then(function(reply){
    console.log('promise: ', + reply);
    self.getRankingFromDb();
});

Что не так в этом случае?

1 Ответ

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

Вы должны всегда возвращать обещание. Обещанием может быть фиктивный текст, null, undefined, void и т. Д. Вы выбираете, но вам необходимо всегда возвращать обещание, чтобы использовать .then() или .catch().

Итак, я просто переместил обещание на несколько строк выше if и сделал else resolve (иначе вы никогда не разрешите, если введете if). Вы также можете отказаться от него, если хотите, чтобы это был ваш выбор.

Вам также необходимо заменить this на self

saveScoreOnDb: function () {
  var self = this;

  return new Promise(function (resolve, reject) {
    if (!self.scoreUpdated && (self.score > self.game.global.currentUser.high_score)) {
      // do this just once
      self.scoreUpdated = true;

      // save current score on Db
      var xhttp = new XMLHttpRequest();
      xhttp.open("PUT", "https://myproject.herokuapp.com/api/users/" + self.game.global.currentUser.id, true);
      xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
      var input = JSON.stringify({
        'high_score': self.score
      });

      xhttp.onload = function () {
        if (xhttp.readyState == XMLHttpRequest.DONE && xhttp.status == 200) {
          console.log('resolved the savetoDB thingy');
          resolve(xhttp.response);
        }
      };
      xhttp.onerror = function () {
        reject(xhttp.statusText);
      };

      xhttp.send(input);
    } else {
      resolve(self.getRankingFromDb());
    }
  });
}
...