移相器/ TypeError:无法读取未定义的属性“ then”

时间:2018-07-05 16:18:47

标签: javascript promise xmlhttprequest

在我的游戏中,我想保存用户的更新分数,然后从数据库中检索排名。我知道承诺是解决之道,我已经在Stack Overflow上尝试过许多答案,但是我无法弄清楚为什么会出现以下错误:

  

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 :(得分:1)

您需要始终返回承诺。承诺可以是伪文本,nullundefinedvoid等。您可以选择,但是您需要始终返回承诺才能使用.then()或{{1 }}。

因此,在这里,我只是将诺言移到.catch()上方几行,并做成了if else(否则,如果您输入resolve,您将永远无法解决。 )。如果您愿意,也可以拒绝它。

您还需要将if替换为this

self