Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase';价值';然后';儿童改变了';事件优化_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase';价值';然后';儿童改变了';事件优化

Javascript Firebase';价值';然后';儿童改变了';事件优化,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,当我的SPA启动时,我想请求一个事件,它给出数据库中代表列表的路径的状态。比如: let users; const handler = (snap) => {}; firebase.ref('/foo').once('value') .then(snap => users = snap) .then(firebase.ref('/foo').on('child_changed', handler)) 目标是作为单个网络事件的一部分立即检索所有用户。然后,我观察任何新的子记

当我的SPA启动时,我想请求一个事件,它给出数据库中代表列表的路径的状态。比如:

let users;
const handler = (snap) => {};

firebase.ref('/foo').once('value')
  .then(snap => users = snap)
  .then(firebase.ref('/foo').on('child_changed', handler))
目标是作为单个网络事件的一部分立即检索所有用户。然后,我观察任何新的子记录,只在新的子记录出现时(而不是整个列表)才获取它们。

在“child_added”事件中使用。获取新用户

更新:
要获取旧消息,请首先在“值”事件上使用。在回调函数中,注册“child_added”的侦听器,并取消对“value”的侦听。我们不使用“一次”,因为当聊天是新的并且没有消息时,“一次”不会被触发。为了仅获取新消息,请使用orderByChild方法对其进行排序,但您需要某种子级,如消息的时间戳,然后使用从“value”上接收的前一个数组中的最后一条消息的时间戳startAt(lastMessage.timestamp)应该有帮助

问题是什么?您希望如何对此进行优化?你是说
。然后(()=>firebase.ref…)
?您可能还需要
snap=>users=snap.val()
。我想要一次获取列表,然后只订阅子更新(与“value”事件相比,它对于初始加载之外的列表来说效率很低),类似的操作在中完成。这有点复杂,因为在某些情况下添加的
子事件可以同步发生,但如果您花一些时间阅读代码,它应该是有意义的。@cartant太好了,我来看看。我已经查看了Emberfire代码,但没有看到,但我会看看是否可以搜索角度代码。是的,我想使用更细粒度的事件,如添加的
child\u
,但重点是我想首先获取带有
值的所有记录
事件,然后切换到细粒度事件,而不添加
child\u
最初为
事件已带回的所有记录触发一个事件。这将优化初始状态(通过
),然后切换到粒度事件,以便随后进行状态维护;我没想到。同样,在我思考的时候,我猜“value”事件也应该用
听一次
,这样它就会立即断开连接。更新答案。解释了为什么“一次”不起作用,至少在当前版本的firebase中是如此。