Firebase limitToFirst没有按预期工作

时间:2015-01-10 19:24:47

标签: javascript json firebase

我正在使用Firebase检索用户的一些数据。我需要使用'gameSearching:true'检索只有一个用户

我现在得到以下代码:

var ref = new Firebase("https://grootproject.firebaseio.com/Users");
    ref.orderByChild("gameSearching").equalTo(true).limitToFirst(1).on("child_added", function (data) {
        var yourself = firebase.getAuth().password.email.split("@", 1)[0];
        var opponent = data.key();

        setData(('Users/' + opponent + '/'), {gameSearching: false});
        setData(('Users/' + yourself + '/'), {gameSearching: false});

        console.log(opponent);
    });

当我运行此代码时,该函数将运行两次。 我正在使用limitToFirst(1)所以我希望只检索一个用户。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

参考

使用on('child_added'向Firebase添加监听器时,将为每个创建的子系统调用该监听器。

ref.on('child_added', function(s) { console.log(s.key()); });

此功能将针对将来添加的所有孩子的所有初始孩子启动。

在您的Firebase中,这是数据:

hallo: gameSearching=false
sam_lous: gameSearching=true
test: gameSearching=false
test2: gameSearching=true

查询

当您向查询添加侦听器时,将为每个属于查询的子项调用它:

ref.orderByChild("gameSearching").equalTo(true).on("child_added‌​", function (s) { console.log(s.key()); })

因此,这将记录所有正在搜索游戏的用户以及稍后开始搜索游戏的用户。

sam_lous: gameSearching=true
test2: gameSearching=true

因此,当您在之前未搜索游戏的用户上致电user.update({ gameSearching: true })时,系统会触发此功能。您实际上是在查看正在搜索游戏的所有用户的列表,而Firebase会为您保留最新的列表。

因此,让我们说用户test开始搜索游戏。当他的gameSeaching设置为true时,您将收到child_added事件:

test: gameSearching=true

同样,当用户测试停止搜索游戏时(通过电话user.update({ gameSearching: false })),Firebase会通过child_removed事件通知您。

有限查询

我们仍然有三个用户正在搜索游戏:

sam_lous: gameSearching=true
test: gameSearching=true
test2: gameSearching=true

您向具有限制的查询添加侦听器:

ref.orderByChild("gameSearching").equalTo(true).limitToFirst(1).on("child_added‌​", function (s) { console.log(s.key()); })

这会触发一个child_added事件:

sam_lous: gameSearching=true

现在,您的代码将sam_lous与对手匹配,并将sam_lous的gameSearching值设置为false。所以sam_lous不再落入查询中。 Firebase仍会使查询保持最新,因此它将:

  1. 为sam_lous
  2. 发送child_removed个活动
  3. child_added发送test个事件(下一个正在搜索游戏的玩家)
  4. Firebase始终牢记的一点是,您不是在查询数据库,而是在同步数据。由于您向Firebase询问了正在搜索游戏的单个玩家的同步列表,这正是它所做的。