gpt4 book ai didi

javascript - Firebase 在所有收藏项上触发,而只有一个已更新

转载 作者:行者123 更新时间:2023-11-30 20:45:37 24 4
gpt4 key购买 nike

每次我对具有相同值和属性的相同对象 (s3) 进行更新时,Firebase 都会触发事件“child_added”,即使没有要添加或更新的内容。我通过在 firebase 控制台上修改主要对象的子集合中的一些值进行了一些测试,并注意到它返回了一个快照,其中第一个元素是正确的,然后集合的所有其他元素作为“已添加”元素返回。这不是真的,因为除了我对其执行操作的那个之外,集合没有改变。

我只需要当我发送存储在数据库中的相同对象时,firebase 会智能地识别没有请求任何操作并且不需要激活触发器。

 var studentiRef = ref.child('studenti/' + s3.matricola);
studentiRef.update(JSON.parse(JSON.stringify(s3)));

studentiRef.on("child_changed", function(userSnapshot) {
var tasseRef = userSnapshot.ref.child('tasse');
tasseRef.on('child_added', function(itemSnapshot, prevKey){
console.log('ADDED ON');
console.log(itemSnapshot.key)
})
});

studentiRef.on("child_changed", function(userSnapshot) {
userSnapshot.ref.child('tasse').on('child_removed', function(itemSnapshot, prevKey){
console.log('REMOVED ON');
console.log(itemSnapshot.key)
})
});

studentiRef.on("child_changed", function(userSnapshot) {
userSnapshot.ref.child('tasse').on('child_changed', function(itemSnapshot, prevKey){
console.log('CHANGED ON');
console.log(itemSnapshot.key)
})
});

更新:

在发布更新之前,我做了一些实验,但没有成功。这里是控制台、数据库和代码的图片。发疯了。这里三张截图:1 firebase data 2 snippet 3 console log

更新二: scenario

behaviours on modifying value in firebase

已解决:通过从 github firebase 示例中获得灵感,我发现了使用 firebase 的一个常见错误:我没有扁平化数据。要继续使用我的数据结构(对象列表中的根对象),解决方案是触发每个对象的更新(伪代码:ref.update(root/childobject) n 次而不是 ref.update(root) .如果其他人遇到这个问题,我会更好地解释。始终扁平化您的数据! (使用火力地堡)

最佳答案

这些事件很可能直接来自客户端 SDK,它不会检测是否存在实际更改。数据库服务器确实执行这样的检查,并且只有在发生实际更改时才会将更改发送给其他客户端。

更新:

当您调用告诉它更新一个节点到它的当前值时,Firebase 客户端 + 服务器的行为如下。

  1. 客户端触发本地事件以反射(reflect)更新。所以 child_changed 将触发。
  2. 客户端将更新发送到服务器。这是必需的,因为客户端和服务器可能(稍微)不同步,而服务器是唯一的真实来源。
  3. 服务器将更新与节点的当前值进行比较。如果相同,则过程到此结束。
  4. 如果更新后的值与当前值不同并通过了验证/权限检查,则数据将提交到磁盘并广播给所有活跃的监听器。
  5. 如果更新值不同,但被验证/权限检查拒绝,服务器将向原始客户端发送拒绝消息,然后触发另一个 child_changed 事件以恢复本地更改。

关于javascript - Firebase 在所有收藏项上触发,而只有一个已更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48734744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com