未能在“websocket”上执行“send”:仍处于连接状态

prdp8dxp  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(899)

我是react js开发新手,尝试将websocket集成到我的应用程序中。
但在连接过程中发送消息时出错。
我的代码是

const url = `${wsApi}/ws/chat/${localStorage.getItem("sID")}/${id}/`;

  const ws = new WebSocket(url);

  ws.onopen = (e) => {
    console.log("connect");
  };

  ws.onmessage = (e) => {
    const msgRes = JSON.parse(e.data);
    setTextMessage(msgRes.type);
    // if (msgRes.success === true) {
    //   setApiMessagesResponse(msgRes);
    // }
    console.log(msgRes);
  };
  // apiMessagesList.push(apiMessagesResponse);

  // console.log("message response", apiMessagesResponse);
  ws.onclose = (e) => {
    console.log("disconnect");
  };

  ws.onerror = (e) => {
    console.log("error");
  };

  const handleSend = () => {
    console.log(message);
    ws.send(message);
  };

我犯了这个错误

Failed to execute 'send' on 'WebSocket': Still in CONNECTING state
u59ebvdq

u59ebvdq1#

听起来你在打电话 ws.send 在套接字完成连接过程之前。你需要等一等 open 事件/回调,或检查 readyState 每个文档,并在 readyState 更改,即在 open 回调已启动。
不是建议你这样做,但这可能会有帮助:

const handleSend = () => {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send()
  } else {
    // Queue a retry
    setTimeout(() => { handleSend() }, 1000)
  }
};

正如洛根提到的,我的第一个例子是懒惰。我只是想让op解锁,我相信读者们足够聪明,能够理解如何从那里开始。因此,请确保适当地处理可用状态,例如,如果 readyStateWebSocket.CONNECTING 然后注册一个侦听器:

const handleSend = () => {
  if (ws.readyState === WebSocket.OPEN) {
    ws.send()
  } else if (ws.readyState == WebSocket.CONNECTING) {
    // Wait for the open event, maybe do something with promises
    // depending on your use case. I believe in you developer!
    ws.addEventListener('open', () => handleSend())
  } else {
    // etc.
  }
};
w41d8nur

w41d8nur2#

我猜只有当数据已经打开时,才可以使用ws发送数据,并且不检查数据是否打开。
基本上,您要求打开,但您在服务器说它已打开之前发送了一条消息(这不是即时消息,您不知道需要多少时间;)
我想你应该添加一个变量,比如 let open = false; 并重写onopen

ws.onopen = (e) => {
    open = true;
    console.log("connect");
  };

然后在您的逻辑中,您只能在open等于true时发送消息
不要忘记错误处理;)

相关问题