Javascript 如何预防';价值';发出集合的客户端上的事件?
调用Javascript 如何预防';价值';发出集合的客户端上的事件?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,调用set()的Firebase客户端将导致所有连接的客户端触发值,包括发出set()的原始客户端 在我的情况下(我认为在大多数情况下),发出set()的客户机没有理由响应它自己的调用生成的值事件。显然,它的模型是正确的,没有必要改变它(这可能是一个昂贵的操作) 客户端是否有办法不接收/防止/忽略由其自己的set()调用触发的value事件?我考虑过在set()周围使用off/on,但这会使客户端错过value事件,这些事件是同时发生的,但不是由它触发的 我是否遗漏了一些明显的东西?大多数应用程
set()
的Firebase客户端将导致所有连接的客户端触发值
,包括发出set()
的原始客户端
在我的情况下(我认为在大多数情况下),发出set()
的客户机没有理由响应它自己的调用生成的值事件。显然,它的模型是正确的,没有必要改变它(这可能是一个昂贵的操作)
客户端是否有办法不接收/防止/忽略由其自己的set()
调用触发的value
事件?我考虑过在set()
周围使用off/on,但这会使客户端错过value
事件,这些事件是同时发生的,但不是由它触发的
我是否遗漏了一些明显的东西?大多数应用程序将Firebase数据本身视为其模型。因此,当有更新时,他们调用
ref.set()
(或另一个mutator函数),然后更新通过on()
事件流回他们的应用程序。React/Flux的爱好者知道这是一个问题,其他人可能知道这是一个问题
但确实存在模型已经更新的情况,因此如果是您触发了Firebase事件,您希望忽略该事件
没有不接收这些自触发事件的API。相反,您必须“记住”发送到Firebase的数据,并在on()
处理程序中将其过滤掉
来自Firebase的Android绘图示例,然后。它使用推送ID来标识线段以及客户端生成的线段,因此可以使用这些ID来跟踪和标识线段
这是一个JavaScript示例:
var pendingChildIds = []; // Push ids of nodes we've sent to the server, but haven't received in `on()` yet
// this code is in your UI event handler, or whatever triggers the needs to update your Firebase data
var newChild = ref.push();
pendingChildIds.push(newChild.key());
newChild.set(
{ property1: 'value1', property2: 3.14 },
function(error) {
// the write operation has completed, remove the child id from the list of pending writes
pendingChildIds.splice(pendingChildIds.indexOf(newChild.key());
}
);
// this is the event handler, using child_added in this case
ref.on('child_added', function(snapshot) {
if (!pendingChildIds.contains(snapshot.key())) {
// this is a child that we DIDN'T generate
}
});
最后,我向模型中添加了一个客户端ID,类似于:
var clientId=(Math.random()*10000000000000000).toFixed(0);
function set(data) {
ref.set(JSON.stringify({ clientId: clientId, data: data }));
}
ref.on('value', function(snapshot) {
var json=JSON.parse(snapshot.val());
if (!json || json.clientId===clientId) return;
var data=json.data;
// update model with data
});
如果我正确地考虑了这一点,那么在使用这种方法进行实时协作的过程中,可能会错过一个活动。考虑客户端A在短时间内设置值x、y、z的情况,客户端B同时更新值m、n、o,并且它们在x、m、y、n、o、z的顺序中交织,然后包含所有更新的值事件将具有客户端A的client,m、n、o将被忽略。从文档中可以看出:“值事件总是最后触发的,并且保证包含在快照拍摄之前发生的任何其他事件的更新。”我建议使用对象来更快地查找和删除。