Firebase 使用外部查询结果函数

Firebase use query result outside function

本文关键字:结果 函数 查询 外部 Firebase      更新时间:2023-09-26

好吧,我对Javascript很陌生,我正在尝试使用firebase作为我正在制作的简单游戏的后端。

我有以下非常简单的javascript代码访问我的数据:

    var myData = new Firebase("https://theurl.firebaseio.com/Player/results");
    var p1;
    var player1 = myData.child("1");
    player1.on("value", function(snapshot) {
        p1 = snapshot.val();  
        console.log(p1["Name"]+ " " + p1["Draws"]);
    });
    /*
    This line seems to be the problem, how do I assign the result of the query outside the above function? */
    p1["Draws"] += 1;
    player1.update({
        "Draws": p1["Draws"]
    });

变量p1未正确分配。我该如何解决这个问题?

变量p1分配得非常好。但是您访问它的时间尚未填充。

为了了解发生了什么,让我们在代码中添加一些日志语句:

var myData = new Firebase("https://theurl.firebaseio.com/Player/results");
var p1;
var player1 = myData.child("1");
console.log('Before reading from Firebase');
player1.on("value", function(snapshot) {
    p1 = snapshot.val();  
    console.log('Result from Firebase: '+p1["Name"]+ " " + p1["Draws"]);
});
console.log('After reading from Firebase');
p1["Draws"] += 1;
player1.update({
    "Draws": p1["Draws"]
});

运行此代码时,您将看到输出为:

从火力基地阅读之前

从火力基地阅读后

结果来自火力基地...

这可能不是您期望的顺序。

原因是数据是从 Firebase 异步加载的。因此,带有player1.on("value'的行开始从Firebase加载数据。但由于这可能需要一些时间,浏览器会在语句后继续执行代码。然后,当 Firebase 中的值可用时,它会使用该数据的snapshot调用您的函数。

这种类型的异步加载在常见的 Web 编程中非常常见。要处理它,您必须反转代码的逻辑。与其说:"首先我得到玩家 1,然后我更新他的抽奖",不如把它想象成"每当玩家 1 的值发生变化时,我都会做 xyz"。

您通常通过将"then"代码移动到回调函数来执行此操作:

var myData = new Firebase("https://theurl.firebaseio.com/Player/results");
var p1;
var player1 = myData.child("1");
player1.on("value", function(snapshot) {
    p1 = snapshot.val();  
    p1["Draws"] += 1;
    player1.update({
        "Draws": p1["Draws"]
    });
});

有关此问题的精彩解释,请阅读为什么在函数内部修改变量后,我的变量保持不变? - 异步代码参考