【问题标题】:When to set online for presence detection using Firebase Realtime database, Firestore and functions何时使用 Firebase 实时数据库、Firestore 和函数在线设置在线状态检测
【发布时间】:2021-07-09 08:16:18
【问题描述】:

我正在实现基于文档的存在检测。有一件事我无法得到它。为什么他们在 Firebase 的文档中设置了当时在线的用户?

我认为正确的代码是

    firebase.database().ref('.info/connected').on('value', function(snapshot) {
        if (snapshot.val() == false) {
            userStatusFirestoreRef.set(isOfflineForFirestore);
            return;
        };
        // I thought they should set a user online here.
        userStatusDatabaseRef.set(isOnlineForDatabase);
        userStatusFirestoreRef.set(isOnlineForFirestore);

        userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(function() {

        });
    });

。另一方面,文件显示

    firebase.database().ref('.info/connected').on('value', function(snapshot) {
        if (snapshot.val() == false) {
            userStatusFirestoreRef.set(isOfflineForFirestore);
            return;
        };

        userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(function() {
            // but the document does here.
            userStatusDatabaseRef.set(isOnlineForDatabase);
            userStatusFirestoreRef.set(isOnlineForFirestore);
        });
    });

在文档中找到。

我认为他们应该将用户设置为在连接时在线。好像检测到离线的时候,先设置isOfflineForDatabase,再设置isOnlineForDatabaseisOnlineForFirestore。这是怎么回事?为什么我的代码不好?实际上,他们的代码运行良好。

感谢您的阅读。

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-firestore google-cloud-functions


    【解决方案1】:

    我明白了。

    userStatusDatabaseRef.onDisconnect()
    

    返回onDisconnect 实例。

    userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase)
    

    返回Future<void>

    所以,

           .then(function() {
                // but the document does here.
                userStatusDatabaseRef.set(isOnlineForDatabase);
                userStatusFirestoreRef.set(isOnlineForFirestore);
            });
    

    在执行此行时立即执行。另外,所有动作都应该在设置 onDisconect 监听器后执行。

    【讨论】:

      【解决方案2】:

      在您从文档中获得的代码中,只有当服务器确认将在用户离开时将其标记为离线时,用户才会被设置为在线。在您的代码中,没有这种依赖关系。

      在绝大多数情况下,两段代码可能会导致相同的结果。但如果在您的代码中注册onDisconnect 处理程序时出现问题,用户仍将被标记为在线,而文档中的代码不会将其标记为在线。

      【讨论】:

        猜你喜欢
        • 2020-07-02
        • 2021-02-11
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        相关资源
        最近更新 更多