如何在useEffect()中刷新signalR的连接id?

问题描述

我有两个 useEffect,所以在第一个中,我建立了到服务器上集线器的连接,第二个用于跟踪连接 ID。但是当我将程序隐藏到后台一段时间后,我的连接 ID 发生了变化,我在此处使用了旧的连接 ID:connection!.on("RecieveMessage"...) 但是,如果我要发送数据,所有数据都会发送到服务器,而不是其他用户。问题是,如何在第二个 useEffect 中刷新连接 ID?我所有的代码

 const [messages,setMessages] = useState<object[]>([]);
const [message,setMessage] = useState("");
const { user } = useContext(AuthContext);
const [connection,setConnection] = useState<HubConnection>();

useEffect(() => {
    (() => {
        const newConnection = new HubConnectionBuilder()
            .withUrl(APIConfig.URL + "signalr/")
            .withAutomaticReconnect()
            .build();

        setConnection(newConnection);
    })();
    props.navigation.setoptions({ headerTitle: props.route.params.header });
},[]);

useEffect(() => {
    if (connection) {
        connection.start().then(() => {
            console.log("Connected!");
            connection.invoke(
                "EnterToGroup",props.route.params.chatId.toString()
            ).catch((err: any) => console.log(err));
        });
        console.log("invoked!");

        ChatService.getCeratinChat(props?.route?.params?.chatId).then((res) => {

            let tempChat: any = [];

            res.data?.messages?.forEach((element: any) => {
                const messagetoAdd = {
                    _id: element?.id,text: element?.text,createdAt: element?.createdAt,user: {
                        _id: element?.senderId?.toString(),name: element?.sender?.name + " " + element?.sender?.surname
                    }
                };

                tempChat.push(messagetoAdd);
            });
            setMessages(tempChat);
        });
        console.log("Use Effect has refreshed");

        connection!.on("RecieveMessage",(receivedMessage: any) => {
            console.log("Connection: ",connection.connectionId);
            setMessages((prevIoUsMessages) =>
                GiftedChat.append(
                    prevIoUsMessages as any,{
                        _id: receivedMessage.id,text: receivedMessage.text,createdAt: receivedMessage.createdAt,user: {
                            _id: receivedMessage.senderId?.toString(),name: receivedMessage?.sender?.name + " " + receivedMessage?.sender?.surname
                        }
                    } as any
                )
            );
        });
        setMessage("");

        return () => {
            connection?.invoke(
                "LeaveTheGroup",props.route.params.chatId.toString()
            );
        };
    }
},[connection]);

const onSend = () => {
    console.log("Current state: ",connection?.state);
    if (connection) {
        const messagetoSend = message.trim();

        if (messagetoSend != "") {
            connection!
                .invoke("SendMessagetoGroup",{
                    Text: messagetoSend,SenderId: user?.id,ChatId: props.route.params.chatId
                })
                .catch((err: any) => console.log(err));
            setMessage("");
        }
    } else {
        console.log("No connection yet");
    }

};

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)