如何预防'价值'发布集的客户端上的事件?

时间:2015-08-19 05:16:35

标签: javascript firebase firebase-realtime-database

调用set()的Firebase客户端将导致所有已连接的客户端value触发 - 包括 - 发出set()的原始客户端。

在我的情况下(我认为在大多数情况下),发出set()的客户端没有理由响应其自己的调用产生的值事件。显然它的模型是正确的,没有必要改变它(这可能是一个昂贵的操作)。

客户端是否有办法不接收/阻止/忽略由其value呼叫触发的set()事件?我考虑在set()左右使用off / on,但这可能会导致客户端错过value同时发生但未被其触发的事件。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:5)

大多数应用程序将Firebase数据本身视为其模型。因此,当有更新时,他们会调用ref.set()(或另一个mutator函数),然后更新会通过on()事件返回到他们的应用中。 React / Flux爱好者将此视为unidirectional data-flow,其他人可能将其视为Command Query Responsibility Segregation

但确实存在模型已更新的情况,因此如果您是触发它的人,您希望忽略Firebase中的事件。

没有用于不接收这些自触发事件的API。相反,你必须记住"您发送到Firebase并在on()处理程序中过滤掉的数据。

来自Firebase keeps a list of segments that it sends to Firebase然后ignores those segments in its onChildAdded handler的Android绘图示例。它使用push 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
    }
});

答案 1 :(得分:1)

我最终在模型中添加了一个客户端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
});