Firebase - 使用once()检索数据库值的问题

时间:2018-06-18 19:15:26

标签: javascript firebase firebase-realtime-database

我现在已经有一整天这个问题,我试图使用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';
        // ...
    });
}

我不知道如何处理这个问题,我希望有人可以帮助纠正这个问题。

1 个答案:

答案 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);
}