防止重复的 websocket 消息 Laravel Echo 和 React
Prevent duplicate websocket message Laravel Echo and React
我有一个应用程序在后端使用 Laravel,在前端使用 React。
我们正在使用 beyondcode/laravel-websockets 从 Laravel 服务器向 React 客户端广播 websocket 消息。
React 可以使用以下代码获取消息:
import Echo from "laravel-echo";
window.Pusher = require("pusher-js");
const options = {
broadcaster: "pusher",
key: "...",
cluster: "...",
encrypted: false,
wsHost: process.env.REACT_APP_WSHOST,
wsPort: 6001,
forceTLS: false,
disableStats: true,
//To be Replace with the Correct URL from ENV
authEndpoint: `http://${process.env.REACT_APP_APIURL}/laravel-websockets/auth`,
};
const echo = new Echo(options);
function App() {
//const dispatch = useDispatch();
echo.channel("ws-test").listen("TestWSEvent", function (e) {
if (e && e != undefined) {
let data_o = JSON.parse(e.message).data;
console.log("socket received",data_o);
//dispatch(ticketReceived(data_o));
}
});
echo.channel("ws-test").listen(...)
部分,如果它在 App class 之外,我每次广播都会收到一条消息。但如果该部分在 App 内,我会收到两条重复消息。
React 不允许在 App 外部使用 dispatch class,所以因为我想使用 redux,所以我希望该部分在 App 内部(但在那里我得到了重复的广播消息)。
我收到这些重复消息的原因是什么?处理这种情况的良好反应方式是什么?
理想情况下,您应该将监听函数移到 useEffect
中,因为我们只想创建一个监听器。
目前我们将为组件的每个渲染添加一个新的侦听器。
useEffect(() => {
echo.channel("ws-test").listen("TestWSEvent", function (e) {
if (e && e != undefined) {
let data_o = JSON.parse(e.message).data;
console.log("socket received",data_o);
//dispatch(ticketReceived(data_o));
}
});
}, []);
我有一个应用程序在后端使用 Laravel,在前端使用 React。
我们正在使用 beyondcode/laravel-websockets 从 Laravel 服务器向 React 客户端广播 websocket 消息。
React 可以使用以下代码获取消息:
import Echo from "laravel-echo";
window.Pusher = require("pusher-js");
const options = {
broadcaster: "pusher",
key: "...",
cluster: "...",
encrypted: false,
wsHost: process.env.REACT_APP_WSHOST,
wsPort: 6001,
forceTLS: false,
disableStats: true,
//To be Replace with the Correct URL from ENV
authEndpoint: `http://${process.env.REACT_APP_APIURL}/laravel-websockets/auth`,
};
const echo = new Echo(options);
function App() {
//const dispatch = useDispatch();
echo.channel("ws-test").listen("TestWSEvent", function (e) {
if (e && e != undefined) {
let data_o = JSON.parse(e.message).data;
console.log("socket received",data_o);
//dispatch(ticketReceived(data_o));
}
});
echo.channel("ws-test").listen(...)
部分,如果它在 App class 之外,我每次广播都会收到一条消息。但如果该部分在 App 内,我会收到两条重复消息。
React 不允许在 App 外部使用 dispatch class,所以因为我想使用 redux,所以我希望该部分在 App 内部(但在那里我得到了重复的广播消息)。
我收到这些重复消息的原因是什么?处理这种情况的良好反应方式是什么?
理想情况下,您应该将监听函数移到 useEffect
中,因为我们只想创建一个监听器。
目前我们将为组件的每个渲染添加一个新的侦听器。
useEffect(() => {
echo.channel("ws-test").listen("TestWSEvent", function (e) {
if (e && e != undefined) {
let data_o = JSON.parse(e.message).data;
console.log("socket received",data_o);
//dispatch(ticketReceived(data_o));
}
});
}, []);