javascript - 在react中收到消息后,Websocket立即未定义

标签 javascript reactjs websocket

我在react中使用websocket。这是该组件的代码:

import React, { useState, useEffect } from "react";

export default function Component(props) {
  const [socket, setSocket] = useState();

  const parseMessage = (msg) => {
    if (msg[0] !== "R") sendMessage("123"); // ignore the very first message from the socket. 
  };

  const sendMessage = (msg) => socket.send(msg); // error at this line

  useEffect(() => {
    const socket = new WebSocket("wss://ws.ifelse.io/");
    socket.addEventListener("message", ({ data }) => {
      if (socket) parseMessage(data);
    });
    setSocket(socket);
  }, []);

  const sendMsg = () => {
    socket.send("test");
  };

  return <button onClick={() => sendMsg("clicked")}>send msg</button>;
}

我收到此错误:TypeError:无法读取标记行处未定义的属性(读取“发送”)。 WebSocket 只是一个回显服务器,它会返回与您发送的内容相同的内容。

如果我将 socket.send 包装在 try-catch block 中,我仍然可以使用按钮从 WebSocket 发送和接收消息,但错误仍然发生在 中的该行发送消息

很明显,套接字变量不是未定义的,因为我能够在错误发生之前和之后发送和接收消息。

所以我的问题是为什么套接字变量仅在收到消息后的短时间内未定义,以及解决此问题的方法是什么。

最佳答案

更好的解决方案是在外部初始化套接字

import React, { useState, useEffect } from "react";

const socket = new WebSocket("wss://ws.ifelse.io/")

export default function Component(props) {
  const ws = useRef(socket)
  
  useEffect(() => {
    ws.current?.addEventListener("message", ({ data }) => {
      parseMessage(data);
    });
    return () => {
      ws.current?.removeAllListeners()
    }
  }, [])

  const parseMessage = (msg) => {
    if (msg[0] !== "R") sendMessage("123"); // ignore the very first message from the socket. 
  };

  const sendMessage = (msg) => ws.current?.send(msg);


  const sendMsg = () => {
    ws.current?.send("test");
  };

  return <button onClick={() => sendMsg("clicked")}>send msg</button>;
}

关于javascript - 在react中收到消息后,Websocket立即未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69249467/

相关文章:

javascript - 解析通过 WebSocket 接收到的 JSON 结果出错

javascript - 搜索无法以 Angular 工作的可折叠内容

javascript - 在鼠标悬停选择菜单上更改颜色

php - regEx 允许在数字之间插入字母

html - Flash 中的网络套接字

java jetty Maven websocket应用程序在本地主机:8080上运行

javascript - 删除空格后的所有字符串

javascript - 如何在部分输入中创建拆分?

与变量值匹配的Javascript映射数据

reactjs - Vuex 和 Redux 不变性方法的差异