Firebase limitToFirst 没有按预期工作
Firebase limitToFirst doesn't work as expected
我正在使用 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)
,所以我希望只检索一个用户。
我做错了什么?
参考资料
当您使用 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 仍会保持查询是最新的,因此它将:
- 为 sam_lous
发送 child_removed
事件
- 为
test
发送一个 child_added
事件(下一个正在搜索游戏的玩家)
使用 Firebase 始终牢记的一点是,您不是在查询数据库,而是在同步数据。由于您要求 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)
,所以我希望只检索一个用户。
我做错了什么?
参考资料
当您使用 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 仍会保持查询是最新的,因此它将:
- 为 sam_lous 发送
- 为
test
发送一个child_added
事件(下一个正在搜索游戏的玩家)
child_removed
事件
使用 Firebase 始终牢记的一点是,您不是在查询数据库,而是在同步数据。由于您要求 Firebase 提供正在搜索游戏的单个玩家的同步列表,这正是它所做的。