这里也有类似的问题。但是它与REST有关,我想问一下javascript-API。我的情况也有点不同。所以也许有人可以提出其他解决方案。我想执行类似于以下内容的查询:
"SELECT * FROM db.table WHERE field1 ="val1";"
使用火力基地,我们可以执行以下操作:
var ref = new Firebase("https://db.firebaseio.com/table");
ref.orderByChild("field1").equalTo("val1").on("value", function(record) {
console.log(record.val())
});
因此,Firebase 会为每个满足 field1="val1" 的孩子触发我的回调函数。它是否为每个 chlid 查询打开新的 TCP 连接?还有没有办法让所有的孩子一次性满足条件(也就是说,当所有孩子都下载到客户端时,会触发一个回调)。
所以 firebase 会为每个满足 field1="val1" 的孩子触发我的回调函数
不完全是。它只触发一次回调函数,在 DataSnapshot 参数中传递所有匹配的节点。您可以使用以下命令循环访问它们:
var ref = new Firebase("https://db.firebaseio.com/table");
ref.orderByChild("field1").equalTo("val1").on("value", function(snapshot) {
snapshot.forEach(function(record) {
console.log(record.val())
});
});
即使只有一个孩子,也需要循环。可以使用snapshot.numChildren()
来确定是否有任何节点与查询匹配。
它是否为每个 chlid 查询打开新的 TCP 连接
不。Firebase 客户端会在您首次调用 new Firebase(...)
时建立 WebSocket 连接。之后,所有通信都通过该WebSocket进行。只有当环境不支持 WebSockets 时,Firebase 才会回退到 HTTP 长轮询。查看浏览器调试器的"网络"选项卡,了解线路上发生的情况。这是相当有教育意义的。
还有没有办法让所有的孩子一次性满足条件(也就是说,当所有孩子都下载到客户端时,会触发一个回调)。
我想我已经回答了这个问题。
根据评论进行更新
传递给 forEach 的回调函数是否同步调用?
是的