有一个类似的问题here。但它与REST有关,我想问一下javascript-API。我的情况也有点不同。所以也许有人可以提出其他解决方案。 我想执行类似这样的查询:
"SELECT * FROM db.table WHERE field1 ="val1";"
使用firebase,我们可以执行以下操作:
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连接?还有什么方法可以让所有孩子一次性满足条件(这是在客户端下载所有孩子时触发的一个回调)。
答案 0 :(得分:1)
因此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连接
不。首次调用new Firebase(...)
时,Firebase客户端会建立WebSocket连接。之后,所有通信都通过WebSocket进行。仅当环境不支持WebSockets时,Firebase才会回退到HTTP长轮询。查看浏览器调试器的网络选项卡,查看网络上的内容。这很有教育意义。
还有什么方法可以让所有孩子一次性满足这个条件(这是在客户端下载所有孩子时触发的一个回调)。
我想我已经回答了那个。
是否将回调函数传递给同步调用的forEach?
是