javascript - 从 WebSocket React 获取数据

标签 javascript reactjs websocket

我从组件中的 Websocket 获取数据:

function Data() {
  const [price, setPrice] = useState("");
  const [date, setDate] = useState("");

  const ws = new WebSocket(
    "wss://stream.tradingeconomics.com/?client=guest:guest"
  );
  const subscription = { topic: "subscribe", to: "EURUSD:CUR" };

  const initWebsocket = () => {
    ws.onopen = () => {
      console.log("Connection Established!");
      ws.send(JSON.stringify(subscription));
    };
    ws.onmessage = (event) => {
      const response = JSON.parse(event.data);

      setPrice(response.price.toFixed(3));
      let today = new Date(response.dt * 1);
      const options = {
        year: "numeric",
        month: "long",
        day: "numeric",
        hour: "numeric",
        minute: "numeric",
        second: "numeric",
      };
      let date = today.toLocaleDateString("en-EN", options);
      setDate(date);

      //ws.close();
    };
    ws.onclose = () => {
      console.log("Connection Closed!");
      //initWebsocket();
    };

    ws.onerror = () => {
      console.log("WS Error");
    };
  };

  useEffect(() => {
    initWebsocket();
    // cleanup method which will be called before next execution. in your case unmount.
    return () => {
      ws.close();
    };
  }, []);

  // useEffect(() => {
  //   setTimeout(initWebsocket(), 10000);
  // }, []);

  return (
    <div>
      Price : {price}
      Last Update: {date}
    </div>
  );
}

export default Data;

关于这个的两个问题:

  1. 使用这段代码,在某些时候我得到了资源不足错误,但数据仍然检索...我不知道为什么。 2) 如果我使用注释的 useEffect,除了 setTimeout 之外,它仍然从网络套接字获取数据...我怎样才能每 10 秒获取一次数据?

最佳答案

您可以使用 setInterval 在定义的时间段内运行代码块。

setInterval(()=>{your function}, 10000)

这只是您上一个问题的答案。如果您想定期运行代码,setInterval 是您的不二之选。

我在代码沙箱中稍微编辑了你的代码:

import "./styles.css";
import { useState, useEffect } from "react";

export default function App() {
  const [price, setPrice] = useState("");
  const [date, setDate] = useState("");

  const subscription = { topic: "subscribe", to: "EURUSD:CUR" };

  useEffect(() => {
    const ws = new WebSocket(
      "wss://stream.tradingeconomics.com/?client=guest:guest"
    );

    ws.onopen = () => {
      console.log("Connection Established!");
      ws.send(JSON.stringify(subscription));
    };
    ws.onmessage = (event) => {
      const response = JSON.parse(event.data);
      console.log(response);

      if (response.topic === "EURUSD") {
        setPrice(response.price.toFixed(3));
        let today = new Date(response.dt * 1);
        const options = {
          year: "numeric",
          month: "long",
          day: "numeric",
          hour: "numeric",
          minute: "numeric",
          second: "numeric"
        };
        let date = today.toLocaleDateString("en-EN", options);
        setDate(date);
      }
      //ws.close();
    };
    ws.onclose = () => {
      console.log("Connection Closed!");
      //initWebsocket();
    };

    ws.onerror = () => {
      console.log("WS Error");
    };

    return () => {
      ws.close();
    };
  }, []);

  // useEffect(() => {
  //   setTimeout(initWebsocket(), 10000);
  // }, []);

  return (
    <div>
      <p>Price : {price}</p>
      <p>Last Update: {date}</p>
    </div>
  );
}

我所做的,基本上是将整个套接字连接放在 useEffect 中,并为响应设置一个 if 条件。

https://codesandbox.io/embed/dark-fog-msg3v?fontsize=14&hidenavigation=1&theme=dark

关于javascript - 从 WebSocket React 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70973122/

相关文章:

javascript - 事件循环什么时候开始?

javascript - 工厂内 promise , promise 完成前返回

javascript - React + Firebase undefined 使用点击事件

使用 Eclipse Paho JavaScript 客户端的 SSL/TLS

asp.net - Ruby 的 SignalR 客户端

javascript - Kendo TreeView 请求展开但不显示返回的数据

javascript - DOMContentLoaded 在简单场景中不像 $(document).ready() 那样工作

reactjs - 具有自创建输入的 Redux 表单

html - 'position: absolute' 的祖 parent 、 parent 和子女管理问题

java - WebSockets - 创建 channel 和推送数据的正确方法