Firebase-javascript API 得到 data-nodes 仅在一个触发器中满足条件。还会为每个查询建立新的 TCP 连接吗?

Firebase-javascript API get data-nodes satisfying a condition in one trigger only. Also does the makes new TCP connection for each query?

有一个类似的问题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" 的 child 触发我的回调函数。它是否为这些 chlid 查询中的每一个打开新的 TCP 连接?还有有什么办法可以一次性把所有满足条件的child都搞定(就是客户端下载完就触发一个回调)

So firebase triggers my callback function for each child that satisfies 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())
  });
});

需要循环,即使只有一个 child。您可以使用 snapshot.numChildren() 来确定是否有 any 个节点匹配您的查询。

Does it opens new TCP connection for each of these chlid queries

没有。 Firebase 客户端会在您首次调用 new Firebase(...) 时建立 WebSocket 连接。之后所有通信都通过该 WebSocket 进行。只有当环境不支持 WebSockets 时,Firebase 才会回退到 HTTP long-polling。查看浏览器调试器的网络选项卡,看看网络上发生了什么。很有教育意义。

Also is there any way to get all the childs satisfying the condition just in one go(That is one callback is triggered when all of them are downloaded at the client).

我想我已经回答了那个问题。

根据评论更新

Are the callback functions passed to forEach called synchronously?