【发布时间】:2018-01-08 02:25:35
【问题描述】:
我在 Firebase 中有一个如下所示的架构:
messages/
$groupId/
$messageId/
message: 'Sample Message'
createdBy: 'userID'
createdAt: 1513337977055
然后我在我的代码中连续执行了以下查询:
// Get a specific message
ref.child('messages/$groupId/$messageId')
.once('value')
.then(snap => console.log('value', snap.val()))
// Start new message listener
ref.child('messages/$groupId')
.orderByKey()
.limitToLast(1)
.on('child_added', snap => console.log('child_added', snap.val()))
我想知道为什么child_added 在这里被调用了两次,第一次与once('value') 查询返回的值相似。
这是控制台显示的内容:
child_added { message: 'Hello', createdAt: 1513337977055, createdBy: 'userId' }
value { message: 'Hello', createdAt: 1513337977055, createdBy: 'userId' }
child_added { message: 'Another message', createdAt: 1513337977066, createdBy: 'userId2' }
请注意,我不会在此处向 Firebase 添加新条目。只是查询。
编辑:这是一个演示问题的小提琴链接:https://jsfiddle.net/dspLwvc3/2/
【问题讨论】:
-
这个事件会为每个现有的孩子触发一次,然后每次有新的孩子添加到指定的路径时再次触发。 ...这意味着您现在有两个数据并触发两次。如果你有 3 个,那么每个会触发 3 个。检查链接以获取更多信息。 firebase.google.com/docs/database/web/…
-
没错。但问题是我没有添加任何新条目。我只是在查询。那么即使我设置了
limitToLast(1),为什么在第一次加载时 child_added 会触发两次? -
这不是主题。问题是,首先触发每个项目并对其进行控制台。然后,如果您添加一条记录,则再触发一条。请参阅上面的文档。
-
我希望
child_added在首次加载时仅触发一次。 -
@FrankvanPuffelen 没有添加新数据。我创建了一个小提琴来演示这个问题:jsfiddle.net/dspLwvc3/2
标签: javascript firebase firebase-realtime-database