无法在“WebSocket”上执行“发送”:仍处于 CONNECTING 状态

han*_*nah 2 javascript websocket web ecmascript-6 reactjs

我是 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);
  };

Run Code Online (Sandbox Code Playgroud)

并得到这个错误

Failed to execute 'send' on 'WebSocket': Still in CONNECTING state
Run Code Online (Sandbox Code Playgroud)

Eva*_*iss 6

听起来好像您在ws.send套接字完成连接过程之前调用。您需要等待open事件/回调,或者检查readyState每个文档readyState并在更改后(即回调触发后)对发送进行排队open

不建议您这样做,但它可能会有所帮助:

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

正如洛根提到的,我的第一个例子是懒惰的。我只是想让 OP 解锁,并且我相信读者足够聪明,能够理解如何从那里获取它。因此,请确保正确处理可用状态,例如 ifreadyStateWebSocket.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.
  }
};
Run Code Online (Sandbox Code Playgroud)