如何在发出集合的客户端上防止 'value' 事件?
How to prevent 'value' event on the client that issued set?
调用 set()
的 Firebase 客户端将导致所有连接的客户端触发 value
- 包括 - 发出 [=11= 的原始客户端].
在我的例子中(我认为在大多数情况下),发出 set()
的客户端没有理由响应它自己的调用产生的值事件。显然它的模型是正确的,没有必要改变它(这可能是一个昂贵的操作)。
客户端有什么方法可以 not-receive/prevent/ignore 由它自己的 set()
调用触发的 value
事件吗?我考虑过在 set()
周围使用 off/on,但这会使客户端错过 value
同时发生但不是由它触发的事件。
我是不是遗漏了什么明显的东西?
大多数应用程序将 Firebase 数据本身视为它们的模型。因此,当有更新时,他们会调用 ref.set()
(或另一个修改器函数),然后更新会通过 on()
事件返回到他们的应用程序中。 React/Flux 爱好者知道这是 unidirectional data-flow, other might know it as Command Query Responsibility Segregation。
但确实存在模型已经更新的情况,因此如果您是触发事件的人,您希望忽略来自 Firebase 的事件。
没有API没有收到这些自触发事件。相反,您必须 "remember" 发送到 Firebase 的数据并在 on()
处理程序中将其过滤掉。
来自 Firebase keeps a list of segments that it sends to Firebase and then ignores those segments in its onChildAdded
handler 的 Android 绘图示例。它使用推送 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
});
调用 set()
的 Firebase 客户端将导致所有连接的客户端触发 value
- 包括 - 发出 [=11= 的原始客户端].
在我的例子中(我认为在大多数情况下),发出 set()
的客户端没有理由响应它自己的调用产生的值事件。显然它的模型是正确的,没有必要改变它(这可能是一个昂贵的操作)。
客户端有什么方法可以 not-receive/prevent/ignore 由它自己的 set()
调用触发的 value
事件吗?我考虑过在 set()
周围使用 off/on,但这会使客户端错过 value
同时发生但不是由它触发的事件。
我是不是遗漏了什么明显的东西?
大多数应用程序将 Firebase 数据本身视为它们的模型。因此,当有更新时,他们会调用 ref.set()
(或另一个修改器函数),然后更新会通过 on()
事件返回到他们的应用程序中。 React/Flux 爱好者知道这是 unidirectional data-flow, other might know it as Command Query Responsibility Segregation。
但确实存在模型已经更新的情况,因此如果您是触发事件的人,您希望忽略来自 Firebase 的事件。
没有API没有收到这些自触发事件。相反,您必须 "remember" 发送到 Firebase 的数据并在 on()
处理程序中将其过滤掉。
来自 Firebase keeps a list of segments that it sends to Firebase and then ignores those segments in its onChildAdded
handler 的 Android 绘图示例。它使用推送 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
});