【Vue项目实战】之WebSocket消息监听

这篇具有很好参考价值的文章主要介绍了【Vue项目实战】之WebSocket消息监听。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

项目场景:
WebSocket.js
getSocketData
问题描述:
原因分析:
解决方案:
总结:
1、添加监听事件(addEventListener)
2、移除监听事件(removeEventListener)

前言
哈喽!CSDN!

很久以前有位好朋友就建议来CSDN做一些笔记,直到最近又被提醒了一次,这次终于想起来了,

好习惯还是需要一个好的开始 ╭(●`∀´●)╯,感谢这位好朋友让我拥有这个好习惯 ╭(′▽)╭(′▽)╯

这位好朋友的博客链接如下:
点击进入

项目场景:

由于业务需求,此次前端界面须接收来自后端服务器WebSocket实时推送的消息来实现进度显示。
WebSocket.js
JS封装WebSocket,代码如下:

let Socket = ''
let setIntervalWesocketPush = null
//缓存ip
let ip = ''
/**
 * 建立websocket连接
 * @param {string} url ws地址
 */
export const createSocket = url => {
    Socket && Socket.close()
    if (!Socket) {
        console.log('建立websocket连接')
        //建立连接的时候缓存服务端ip以便于其他方法调用
        ip = url;
        Socket = new WebSocket(url)
        //发送心跳
        Socket.onopen = onopenWS
        //接收消息
        Socket.onmessage = onmessageWS
        //连接失败重连
        Socket.onerror = onerrorWS
        //断开重连
        Socket.onclose = oncloseWS
    } else {
        console.log('websocket已连接')
    }
}

/**打开WS之后发送心跳 */
const onopenWS = () => {
    sendPing()
}

/**连接失败重连 */
const onerrorWS = () => {
    Socket.close()
    clearInterval(setIntervalWesocketPush)
    console.log('连接失败重连中')
    if (Socket.readyState !== 3) {
        Socket = null
        createSocket(ip)
    }
}

/**WS数据接收统一处理 */
const onmessageWS = e => {
    window.dispatchEvent(new CustomEvent('onmessageWS', {
        detail: {
            data: e.data
        }
    }))
}

/**
 * 发送数据但连接未建立时进行处理等待重发
 * @param {any} message 需要发送的数据
 */
const connecting = message => {
    setTimeout(() => {
        if (Socket.readyState === 0) {
            connecting(message)
        } else {
            Socket.send(JSON.stringify(message))
        }
    }, 1000)
}

/**
 * 发送数据
 * @param {any} message 需要发送的数据
 */
export const sendWSPush = message => {
    if (Socket !== null && Socket.readyState === 3) {
        Socket.close()
        createSocket(ip)
    } else if (Socket.readyState === 1) {
        Socket.send(JSON.stringify(message))
    } else if (Socket.readyState === 0) {
        connecting(message)
    }
}

/**断开重连 */
const oncloseWS = () => {
    clearInterval(setIntervalWesocketPush)
    console.log('websocket已断开....正在尝试重连')
    if (Socket.readyState !== 2) {
        Socket = null
        createSocket(ip)
    }
}
/**发送心跳
 * @param {number} time 心跳间隔毫秒 默认5000
 * @param {string} ping 心跳名称 默认字符串ping
 */
export const sendPing = (time = 5000, ping = 'ping') => {
    clearInterval(setIntervalWesocketPush)
    Socket.send(ping)
    setIntervalWesocketPush = setInterval(() => {
        Socket.send(ping)
    }, time)
}

getSocketData
监听并处理来自服务端WebSocket推送的消息。

  data() {
    return {
      //声明一个变量来注册监听事件
      getSocketData: null,
      url: 'ws://localhost/webSocket'
    }
  },
  methods:{
     init() {
      //页面初始化的时候开启WebSocket
      createSocket(this.url);
      // 创建接收消息函数
      this.getSocketData = e => {
       const data = e && e.detail.data
       //这边编写处理服务端消息代码
      }
      //注册监听事件
      window.addEventListener('onmessageWS', this.getSocketData)
     }
  },
  mounted() {
     this.init();
  }

问题描述:

注册监听服务端WebSocket推送的消息后,刷新、关闭并重新打开页面的时候会遇到一个问题,客户端页面接收消息时会有重复的消息,同一条消息重复接收多次,导致多次弹窗、显示错误等问题。
js中怎么使用websocket监听信息,vue.js,websocket,前端

原因分析:

开始问题排查:

  1. 检查服务端WebSocket消息推送代码逻辑,进行断点调试,没问题。
  2. 检查前端webSocket.js代码,console.log()进行打桩调试,没问题。
  3. 检查前端页面创建接收消息函数代码进行打桩调试,没问题。
  4. 通过Chrome控制台查看Event Listeners,发现问题所在。
    js中怎么使用websocket监听信息,vue.js,websocket,前端

如上图所示,onmessageWS同时有3个监听事件,所以当接收WebSocket消息触发的所有动作都会因此执行三遍。
解决方案:
在vue生命周期的destroyed阶段进行监听,详细代码如下:

  destroyed() {
  	//移除监听器
    window.removeEventListener('onmessageWS', this.getSocketData);
  }

当页面销毁时,移除监听器,这样就不会导致重复监听。

总结:

本次排查此问题从后端到前端前后大概1小时左右时间,感觉时间有点久,看来技术还得和各位大佬多学学,以下找到篇写得不错的关于此次问题的博文,和大家分享一下。

1、添加监听事件(addEventListener)

语法:element.addEventListener(event, function, useCapture)

event:指定事件名(注意: 不要使用 “on” 前缀。 例如,使用 “click” ,而不是使用 “onclick”)

function:指定要事件触发时执行的函数(事件对象会作为第一个参数传入函数)

useCapture:指定事件是否在捕获或冒泡阶段执行,默认false(true - 事件句柄在捕获阶段执行,false-事件句柄在冒泡阶段执行)

mounted() {
	//添加监听器
    window.addEventListener("resize", this.setNavLeft);
},
methods: {
    listenerFunction(e) {
      document.addEventListener("scroll", this.handleScroll, true);
    },
}

2、移除监听事件(removeEventListener)

语法:element.removeEventListener(event, function, useCapture)

注意:在vue中销毁事件监听,一定要在destroyed生命周期中执行,在 beforeDestroy到destroyed之间,执行组件事件拆卸,在beforeDestroy中执行事件销毁是成功不了的。文章来源地址https://www.toymoban.com/news/detail-799129.html

destroyed() {
	//移除监听器
    document.removeEventListener("scroll", this.handleScroll, true);
    window.removeEventListener("resize", this.setNavLeft);
},

到了这里,关于【Vue项目实战】之WebSocket消息监听的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Websocket服务监听收发消息

    application.properties

    2024年03月18日
    浏览(40)
  • 消息服务应用1——java项目使用websocket

    在当前微服务项目中,由于业务模块众多,消息服务的使用场景变得异常活跃。而WebSocket由于其自身的可靠性强,实时性好,带宽占用更小的优势,在实时通讯应用场景中独占鳌头,加上HTML5标准的普及流行,在前端和后端开发中应用异常广泛。 一.关于WebSocket 1.WebSocket是什么

    2024年04月25日
    浏览(30)
  • 【WebSocket项目实战】聊天室(前端vue3、后端spring框架)

    最近我学习了WebSocket,为了更好地掌握这一技术,我决定通过做一个项目来巩固学习成果。在这个项目中,我将使用JavaScript和WebSocket来实现实时通信,让客户端和服务器端能够实时地传递和接收数据。通过这个项目,我希望能够更深入地了解WebSocket的工作原理,并且能够在实

    2024年02月04日
    浏览(46)
  • 在 Vue.js 中,使用 watch 监听data变量如:对象属性/data变量

    在 Vue.js 中,使用 `watch` 监听对象属性 的变化时,应该将属性名作为 字符串 传递给 `watch` 选项。 示例如下: ```javascript updateAddChuZhenForm函数 现在,当 `isCheck1` 或 `isCheck2` 的值发生变化时,相应的 `watch` 函数将被触发。 ``` 如果你想要 监听一个普通变量 ,而 不是 Vue 实例的属

    2024年02月09日
    浏览(43)
  • 【项目实战】如何使用Postman调用WebSocket程序

    项目中需要使用WebSocket进行通信,开发完了WebSocket接口,总得测试吧,以下是Postman调用WebSocket程序的方法。 最近都在用ApiFox做接口调用,但是目前版本的ApiFox(2.2.26)竟然不支持调用WebSocket程序。好吧,只能另外找一个支持调用的工具, 那就是强大的Postman啦。 Postman v8.5以

    2024年02月03日
    浏览(36)
  • vue项目上线之后出现WebSocketClient.js:13 WebSocket connection to ‘ws://localhost:8081/ws‘ failed:

     原因就是开发环境与生产环境的区别,解决方法:如果没使用过webscoket的话,禁用它就好了

    2024年02月08日
    浏览(49)
  • 【前端】vue.js从入门到项目实战笔记

    【前端目录贴】 文本插值中的代码被解释为节点的文本内容,而HTML插值中的代码则被渲染为视图节点。 3.1.1 文本插值 文本插值的方式:用 双大括号 将要绑定的变量、值、表达式括住就可以实现,Vue将会 获取计算后的值 ,并以 文本的形式 将其展示出来。 结果: 3.1.2 HTM

    2024年01月21日
    浏览(50)
  • Vue+JS+Element UI实战(电商项目1)

    目录 1.电商业务概述 2.电商后台管理系统的功能 ​3.项目初始化步骤 4.后台项目的环境安装配置 4.1. API V1 接口说明 4.2. 支持的请求方法 4.3. 通用返回状态说明 5.测试后台接口是否正常 6.登录/退出功能 1.登录概述 1.登录业务流程 2.登录业务的相关技术点 3.token原理  2.登录功能

    2024年02月05日
    浏览(38)
  • 『赠书第 2 期』- 『Django+Vue.js商城项目实战』

    ps. 文末有抽奖,抽奖为 Swift社区 额外福利 受邀参加了 CSDN 举办的 1024 程序员节上海站的活动,并且作为分享嘉宾和在场技术爱好者进行技术探讨。 其中有一个非常有意思的讨论话题,“35岁真的是程序员职业生涯的转折点吗?” 我分享的主要观点是,不管是否是转折点,最

    2024年02月07日
    浏览(41)
  • vue项目中如何使用websocket(步骤)

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。Vue是一种流行的JavaScript框架,用于构建用户界面。 结合WebSocket和Vue,可以实现实时数据通信和动态更新UI的效果 。 在本教程中,我们将学习如何在Vue应用程序中使用WebSocket。 步骤1:安装WebSocket库 使用npm安装WebSocket库。

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包