Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何预防';价值';发出集合的客户端上的事件?_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

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将被忽略。从文档中可以看出:“值事件总是最后触发的,并且保证包含在快照拍摄之前发生的任何其他事件的更新。”我建议使用对象来更快地查找和删除。