Firebase onDisconnect如何触发其他函数?

4
我正在阅读Firebase文档中关于onDisconnect的内容,但它并没有说明我要寻找的操作。 https://firebase.google.com/docs/reference/js/firebase.database.OnDisconnect 目标:当连接断开时,我希望运行一个函数,更新其他与此连接数据无关的数据。
我的代码如下:
let PlayerRef = database.ref("/players");
let MessageRef = database.ref("/messages");
let con=playersRef.child(0).push('test');   
con.onDisconnect().remove(); // yes i want to remove that current connection
// BUT I also want to update the MessageRef that is 
//using the data in the "con", how can I acheive this???

我该如何实现这个目标?

5个回答

7

您可以将onDisconnect()处理程序附加到数据库中的任何位置,并删除或写入该位置的数据。

但请注意,onDisconnect()通过提前将写操作发送到Firebase服务器来工作。因此,只要在附加onDisconnect侦听器时可以在客户端上计算出该值,就可以编写任何值。


我真的不太明白这个。我试图更新的数据并没有与.onDisconnect()函数相关联。基本上,我有locA.onDisconnect().wantToUpdate(locB) - WABBIT0111
onDisconnect can be attached to any location, so locB.onDisconnect().set(...) - Frank van Puffelen
一般来说,.onDisconnect() 方法并不知道已经断开连接的具体内容,它只是检测到有东西已经被断开连接了。 - WABBIT0111
2
你似乎认为Firebase会为每个引用保持连接,但实际上并不是这样的。一个客户端(在大多数情况下)只会与服务器保持单个开放连接。如果该客户端断开连接,则来自该客户端的所有onDisconnect()处理程序都将触发。 - Frank van Puffelen

1
使用onDisconnect(),您可以在remove()内触发函数:
    this.ref.onDisconnect().remove((err)=> {
        if (err) {
            console.error('could not establish onDisconnect event', err);
        }
    });

你需要在里面添加 'if(err)',因为由于某种原因它会在连接激活时立即执行,而且更糟糕的是,它会删除 Firebase 数据库中该链接中的所有数据。

更好的方法是在 Firebase 断开连接时添加触发器:

    const Ref = new Firebase('...firebaseio.com');
    Ref.child('users/water').on('value', (data) {
        if (data.val() == true) {
            /* trigger when disconnected */
        } else {
           /* trigger when connected */
        }
    });

0

你还可以使用onDisconnect()写入一个节点,触发云函数运行你的“更新与此连接数据无关的其他数据”的逻辑。

如果你想要在客户端断开连接时触发一个函数,你需要在客户端上设置onDisconnect(),然后将其写入一个位置,以触发一个函数来响应该事件。

参考讨论:如何在Firebase中将onDisconnect与Cloud Functions结合使用


0

0
根据文档,.remove 接受一个回调参数。我相信你可以利用它。像这样:
con.onDisconnect().remove(() => {
  MessageRef.update(...);
});

1
我刚刚尝试了一下,但似乎不起作用。无论连接是否断开,回调函数都会被调用。 - WABBIT0111
1
你能发一个例子展示你是如何做到的吗?并更新问题,以便其他用户可以看到你尝试过的内容。添加测试。 - jkris
con.onDisconnect().remove(function(){ MessageRef.set({message: "test"}); // 这个不会在断开连接时插入 }); - WABBIT0111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接