Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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 在断开连接时与firebase发生本机反应_Javascript_Reactjs_Firebase_React Native_Google Cloud Firestore - Fatal编程技术网

Javascript 在断开连接时与firebase发生本机反应

Javascript 在断开连接时与firebase发生本机反应,javascript,reactjs,firebase,react-native,google-cloud-firestore,Javascript,Reactjs,Firebase,React Native,Google Cloud Firestore,我构建react本机应用程序,并尝试在用户关闭应用程序时生成事件,因此它会在firebase中将状态更新为“脱机”。 我所做的是 import React, { Component } from 'react' import Router from './src/Router' import firebase from 'react-native-firebase'; export default class App extends Component { constructo

我构建react本机应用程序,并尝试在用户关闭应用程序时生成事件,因此它会在firebase中将状态更新为“脱机”。 我所做的是

    import React, { Component } from 'react'
import Router from './src/Router'
import firebase from 'react-native-firebase';

export default class App extends Component {
    constructor(props){
        super(props)
        this.state = {
            uid: '',
            userStatusDatabaseRef :'',
            userStatusFirestoreRef: ''
        }
    }
    componentWillMount() {
        firebase.auth().signInAnonymouslyAndRetrieveData().then((user) => {

            var uid = firebase.auth().currentUser.uid;
            console.log('uid', uid)
            var userStatusDatabaseRef = firebase.database().ref('status/' + uid);

            var isOfflineForDatabase = {
                state: 'offline',
                last_changed: firebase.database.ServerValue.TIMESTAMP,
            };

            var isOnlineForDatabase = {
                state: 'online',
                last_changed: firebase.database.ServerValue.TIMESTAMP,
            };

            var userStatusDatabaseRef = firebase.database().ref('status/' + uid);

            var userStatusFirestoreRef = firebase.firestore().doc('status/' + uid);


            var isOfflineForFirestore = {
                state: 'offline',
                last_changed: firebase.firestore.FieldValue.serverTimestamp(),
            };

            var isOnlineForFirestore = {
                state: 'online',
                last_changed: firebase.firestore.FieldValue.serverTimestamp(),
            };

            const connectedRef = firebase.database().ref(".info/connected");
            connectedRef.on("value", function (snap) {
                // validate if connection is established
                if (snap.val() === true) {
                    // remove the user's record on the disconnect
                    userStatusDatabaseRef.onDisconnect().set(isOfflineForDatabase).then(()=>{
                        userStatusFirestoreRef.set(isOnlineForFirestore);

                    })
                    // then request user to enter their name
                } else {
                    userStatusFirestoreRef.set(isOfflineForFirestore);

                }
            });
            this.setState({userStatusDatabaseRef,userStatusFirestoreRef,uid})
        })

    }
    render() {
        return <Router />
    }
    componentWillUnmount(){
        var isOfflineForFirestore = {
            state: 'offline',
            last_changed: firebase.firestore.FieldValue.serverTimestamp(),
        };

        this.state.userStatusFirestoreRef.set(isOfflineForFirestore);

    }
}
为什么不将firestore中的值也设置为“脱机”

 userStatusDatabaseRef.onDisconnect().remove((error)=>{
                    userStatusDatabaseRef.set(isOfflineForFirestore); // it update only in firebase
                    userStatusFirestoreRef.set(isOfflineForFirestore);

                })

一旦建立firebase
onDisconnect()
操作,该操作将在firebase实时服务器上启动。它检查用户是否可以执行写操作,如果无效,则为相同的操作传递回调

它还检查连接状态。当您的连接被客户端丢失或超时或故意关闭时,将调用该连接

问题的第二部分取决于导航的性质,组件umounts是否因此与服务器断开连接,或者它是否嵌套在同一服务器中

根据,您可以使用删除操作

确保在客户端断开连接时(由于关闭浏览器、导航到新页面或网络问题)删除此位置的数据

另外要注意的是


onDisconnect
操作仅触发一次。如果希望每次发生
断开
操作,则需要在每次重新连接时重新建立断开操作

如何查看其调用?当连接中断时,我不会被炒鱿鱼。。我正在寻找一种方法,在断开连接或用户关闭更新时回调并写入firebase,您可以使用
删除
来检查它,也可以检查注释。我根据您的建议更改了它,并且它仅在firebase中删除,我希望它在firestore中更新为“在Firebase中删除后脱机”检查您是否具有写入权限,以及文档是否存在
userStatusFirestoreRef.set(IsoflineForFireStore,{merge:true})
以合并文档。
 userStatusDatabaseRef.onDisconnect().remove((error)=>{
                    userStatusDatabaseRef.set(isOfflineForFirestore); // it update only in firebase
                    userStatusFirestoreRef.set(isOfflineForFirestore);

                })
 YourFireBaseRef.onDisconnect().remove((error) => {
      // Do some stuff
    });