我现在已经有一整天这个问题,我试图使用once()从我的实时数据库中检索一个值,但它只会给我一个未定义的值或一个promise没有解决或拒绝。我首先根据文档中给出的示例编写了我自己的代码片段(尽管我尽了最大的努力 - 我无法理解得很好)但是它经常返回" undefined"无论我尝试什么,这里都是我写的代码:
firebase.database().ref('users/' + window.userid + '/MGScore').once('value').then(function (snapshot) {
window.highscore = snapshot.val();
// ...
});
console.log(highscore);
最终我决定只复制并粘贴文档中使用的示例,只是更改名称,但它也会以返回的promises形式遇到问题,这些问题从未自行解决或被拒绝:
function checkHighscore() {
var userId = window.userid;
return firebase.database().ref('/users/' + userId).once('value').then(function (snapshot) {
var highscore = (snapshot.val() && snapshot.val().MGScore) || 'Anonymous';
// ...
});
}
我不知道如何处理这个问题,我希望有人可以帮助纠正这个问题。
答案 0 :(得分:0)
你可能会错误地处理你的承诺。
firebase.database().ref('users/' + window.userid + '/MGScore').once('value').then(function (snapshot) {
window.highscore = snapshot.val();
// ...
});
console.log(highscore);
我假设highscore
应为window.highscore
,因为在此示例中它将是未定义的?
您正在混合异步/同步工作流程。
// Execute 1st
firebase.database().ref('users/' + window.userid + '/MGScore').once('value')
.then(function (snapshot) {
// Execute 3rd
window.highscore = snapshot.val();
});
// Execute 2nd
console.log(highscore);
控制台日志将在thenable函数之前执行 - 因为它是异步并等待firebase返回响应。
您可能需要将代码重构为以下内容;
baseFunction() {
// Execute 1st
firebase.database().ref('users/' + window.userid + '/MGScore').once('value')
.then(function (snapshot) {
// Execute 2nd
window.highscore = snapshot.val();
// Highscore is set - Call next function
highscoreSet();
});
}
highscoreSet() {
// Execute 3rd
console.log(highscore);
}