Firebase-javascript API 仅在一个触发器中获取满足条件的数据节点.还会为每个查询建立新的 TCP

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

本文关键字:节点 数据 TCP 建立 查询 条件 满足 API 获取 触发器 一个      更新时间:2023-09-26

这里也有类似的问题。但是它与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 的回调函数是否同步调用?

是的