在我的游戏中,我想保存用户的更新分数,然后从数据库中检索排名。我知道承诺是解决之道,我已经在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();
});
在这种情况下怎么了?
答案 0 :(得分:1)
您需要始终返回承诺。承诺可以是伪文本,null
,undefined
,void
等。您可以选择,但是您需要始终返回承诺才能使用.then()
或{{1 }}。
因此,在这里,我只是将诺言移到.catch()
上方几行,并做成了if
else
(否则,如果您输入resolve
,您将永远无法解决。 )。如果您愿意,也可以拒绝它。
您还需要将if
替换为this
self