首页 > 其他分享 >vuex结合websocket使用

vuex结合websocket使用

时间:2024-04-20 12:22:32浏览次数:13  
标签:websocket res socketTask dispatch state 结合 false vuex store

1、创建一个store文件夹,并在其中创建store.js文件,结合vuex:

import Vue from 'vue'
import Vuex from 'vuex'
import common from "../common/common.js";
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
/**
* 是否需要强制登录
*/
forcedLogin: false,
hasLogin: false,
userName: "",
carData:[],
finishedProductData:[],
account:'',
socketTask: null,
websocketData:{},
initConnect:false,//初始化连接状态
lockReconnect:true,
timeout: 5 * 1000, //每5秒发起一次心跳,
timeoutObj: null, //⼼跳⼼跳倒计时
dispatchHeartObj:null,
showReconnect:false ,//正在重连,
heartTimeNum:0,
},
mutations: {
login(state, userName) {
state.userName = userName || '新用户';
state.hasLogin = true;
},
logout(state) {
state.userName = "";
state.hasLogin = false;
},
setCarData(state,info){
state.carData=info
},
setFinishedProductData(state,info){
state.finishedProductData=info
},
setAccount(state,info){
state.account=info
},
setWebsocketData (state, data) {
state.websocketData = data
// console.log(state.websocketData)
}
},

//actions存放异步函数
actions: {
//websocket初始化
websocketInit ({ state, dispatch }, url) { //actions的函数有两个:context和value,其中context包括state,dispatch,commit等,这里使用了解构的方式
state.socketTask = uni.connectSocket({
url, // url是websocket连接ip
success: () => {
console.log('成功')
},
fail: e => {
state.lockReconnect=false
}
})

//websocket自带的监听函数:onOpen,onMessage,onClose,onError
state.socketTask.onOpen(() => dispatch('websocketOnOpen'))  //websocketOnOpen是异步函数且写在actions函数内部,所以要使用dispatch关键字来触发
state.socketTask.onMessage(res => dispatch('websocketOnMessage', res))
state.socketTask.onClose(e => dispatch('websocketOnClose',e))
state.socketTask.onError(e => dispatch('websocketOnError',e))
//在初始化时触发心跳,重连时不可再调用,否则会产生多个setInterval定时器,使心跳无法保证每5秒执行一次
if(state.dispatchHeartObj!=null){
clearTimeout(state.dispatchHeartObj)
}
state.dispatchHeartObj=setTimeout(()=>{
dispatch('startWsHeartbeat')
},1000)
},
//重连调用
websocketconnect({state,dispatch},url){
state.socketTask = uni.connectSocket({
url, // url是websocket连接ip
success: () => {
},
fail: e => {
}
})
state.socketTask.onOpen(() => dispatch('websocketOnOpen'))
state.socketTask.onMessage(res => dispatch('websocketOnMessage', res))
state.socketTask.onClose(e => dispatch('websocketOnClose',e))
state.socketTask.onError(e => dispatch('websocketOnError',e))
},
websocketOnOpen () {
},
// 收到数据,此处无需进行心跳重置
websocketOnMessage ({ commit,dispatch,state}, res) {
if(res){
state.lockReconnect=true
state.showReconnect=false
state.heartTimeNum=0
if (res.data !== '连接成功') {
commit('setWebsocketData', (JSON.stringify(res)))
}
}
},
//websocket关闭监听
websocketOnClose ({ state,commit, dispatch },e) {
state.initConnect=false //可以在这里修改state变量,但不推荐,一般使用commit来触发
},
websocketOnError ({ commit, dispatch,state },e) {
state.lockReconnect = false;
state.initConnect=false
},
//手动关闭
websocketClose ({ state,dispatch }) {
if (state.socketTask==null){
return
}
state.socketTask.close({
success (res) {
state.lockReconnect = false;
dispatch('reconnect')
},
fail (err) {
}
})
},
// 手动发送数据
websocketSend ({ state }, data) {
uni.sendSocketMessage({
data,
success: res => {
},
fail: e => {
}
})
},
//开启心跳
startWsHeartbeat({ state,dispatch}, data) {
if(state.timeoutObj!=null){
clearInterval(state.timeoutObj)
}
//每5秒发送一次心跳请求
state.timeoutObj=setInterval(() => {
var sendData={
Command:'0004',
Ip:common.apiUrllogo,
SerialNumber:Math.random(),
Status:'2',
Result:'前端发起心跳请求'
}
dispatch('websocketSend',JSON.stringify(sendData))
//心跳次数递增
state.heartTimeNum++
//规定30秒之内如果接收不到服务端的心跳反馈,就手动关闭websocket,以便重连
if(state.heartTimeNum*5000>30*1000){
dispatch('websocketClose')
state.lockReconnect = false;
}
},5000)

},
//重连
reconnect({ state,dispatch}) {
if(state.lockReconnect==true){
return;
};
state.showReconnect=true
dispatch('websocketconnect',"ws://" + common.apiUrllogo + "/webSocket")
},
}
})

export default store

2、在main.js文件中全局挂载store

import store from './store/store.js'

Vue.prototype.$store = store;

const app = new Vue({
store,//挂载,
...App
})

3、在外部文件使用store:

methods: {
createWebsocket(){
if(this.$store.state.initConnect==false){
this.$store.dispatch('websocketInit', "ws://" + common.apiUrllogo + "/webSocket") //$store为全局挂载的变量,使用dispatch关键字调用store.js文件中的actions函数中的websocketInit方法
this.$store.state.initConnect=true   //使用.$store.state.变量来修改state变量
}
},

}

 

标签:websocket,res,socketTask,dispatch,state,结合,false,vuex,store
From: https://www.cnblogs.com/panzai/p/18147555

相关文章

  • 用 React 结合 SAP UI5 Web Components 来开发 SAP Fiori 应用
    用React结合SAPUI5WebComponents来开发SAPFiori应用阿里云开发者​已认证账号​关注 6人赞同了该文章简介:用React结合SAPUI5WebComponents来开发SAPFiori应用在FioriFundamentals和SAPUI5WebComponent诞生之前,SA......
  • websocket 压测
    压测背景:项目上线需要知道有多少个用户和导购能同时在线,并且正常使用场景分析:先进行用户端连接服务器,然后导购端在链接服务器,然后开始拉取视频列表,最后接听视频脚本设计:设置三个线程组线程组一,负责用户端链接socket,并且发送请求视频通话请求线程组二,负责导购端链接so......
  • vue中websocket的使用---详解
    一、什么是webscoketWebSockets 是一种先进的技术,它可以在用户的浏览器和服务器之间打开交互式通信会话。使用此API,可以向服务器发送消息并接收事件驱动的响应,而无需通过轮询服务器的方式以获得响应。 WebSockets这种技术中有一个接口名为WebSocket,它是一个用于连接WebSoc......
  • Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案
    原文首发链接:Swoole实践篇之结合WebRTC实现音视频实时通信方案大家好,我是码农先森。引言这次实现音视频实时通信的方案是基于WebRTC技术的,它是一种点对点的通信技术,通过浏览器之间建立对等连接,实现音频和视频流数据的传输。在WebRTC技术中通常使用WebSocket服务来协......
  • 07_NET中Ocelot结合Consult使用
    Consul主机:http://localhost:8500新建子服务:Consul.ServiceA【http://localhost:5011】,Consul.ServiceB【http://localhost:5012】配置内容(06_NET中使用Consul(服务发现)-野码-博客园(cnblogs.com))Consul.ServiceA:[Route("[controller]/[action]")][ApiControlle......
  • 快速上手Vuex
    1.简介Vuex是状态管理插件在vue最重要就是数据驱动和组件化,每个组件都有自己data,**template**和**methods**,**data**是数据,我们也叫做状态,通过methods中方法改变状态来更新视图,在单个组件中修改状态更新视图是很方便的,但是实际开发中是多个组件(还有多层组件嵌套)......
  • Springboot集成WebSocket实现智能聊天【Demo】
    背景openai目前越来越流行,其他ai产业也随之而来,偶然翻到openai接口文档,就想着可以调用接口实现智能聊天,接下来就写写我怎么接入websocket的过程,文笔不佳,谅解。接入WebSocket1.webSocket依赖<dependency><groupId>org.springframework.boot</groupId><artifactId......
  • websocket-fmp4播放器wsPlayer
    https://blog.csdn.net/tech2ipo/article/details/124369020 https://github.com/ZLMediaKit/ZLMediaKithttps://github.com/chatop2020/AKStream 一、web视频播放器的现状与问题1、流媒体协议选型:主流流媒体协议归纳总结:协议名称 网络传输协议 延时 编码类型 HTML5支持情......
  • jdbc结合druid连接池访问postgreSQL数据库
    jdbc结合druid连接池访问postgreSQL数据库连接mysql的话也是一个道理,就是把对应的依赖和数据库驱动换一下一.在pom.xml里面加上对应的依赖<!--druid数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring......
  • Vuex和Pinia
    一、区别     pinia它没有mutation,他只有state,getters,action【同步、异步】使用他来修改state数据。pinia默认也是存入内存中,如果需要使用本地存储,配置上比vuex麻烦一点。pinia语法比vuex更容易理解和使用,灵活。pinia没有modules配置,没一个独立的仓库,都是definSto......