Firebase-javascript API仅在一个触发器中获取满足条件的数据节点。还为每个查询创建新的TCP连接?

时间:2016-01-22 16:51:24

标签: javascript firebase firebase-realtime-database

有一个类似的问题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连接?还有什么方法可以让所有孩子一次性满足条件(这是在客户端下载所有孩子时触发的一个回调)。

1 个答案:

答案 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?