如何在发出集合的客户端上防止 '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
});