最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 记录 |vuex与websoket应用

    正文概述 掘金(sanhuamao)   2021-04-02   597

    效果

    记录 |vuex与websoket应用

    vuex

    import { getExportLogs } from "@/api/login";
    
    const store = new Vuex.Store({
      //全局状态
      state: {
        logs:[],//导出记录
      },
        
      getters: {
        logs:state=>state.logs,
      },
      
      //改变状态
      mutations:{
        SET_LOGS(state, val) {
            state.logs = val;
        },
      },
      
      //异步事件
      actions:{
       _getLogs({ commit }) {
        return new Promise((resolve, reject) => {
          getExportLogs()//调用函数-获取导出记录
            .then(res => {
              if (res.msg == 'ok') { 
                commit("SET_LOGS", res.data);//调用成功时重置状态
                resolve(res.data);//传出导出记录数据
              } 
            .catch(error => {
              reject(error);
            });
        });
      }
        
    })
    
    
    
    

    挂载时调用:导出记录我做成了一个组件,镶嵌在页面的头部组件里。这里是指导出记录的组件挂载时

    import { mapGetters } from 'vuex'
    
    export default{
    	async mounted(){
    	    this.$store.dispatch("user/_getLogs")
    	},
    	
    	//以便数据更新时视图能实时渲染
    	computed: {
    	    ...mapGetters([
    	        'logs',
    	    ])
    	},
    }
    
    

    websocket

    流程是建立连接——绑定账号(省略)——进行了导出操作后,待后台处理完毕后会发送数据过来,这时候前端就负责弹出这个下载框

    import store from "@/store/index";
    import { Message } from "element-ui";
    
    export default function initWebsocket() {
        //心跳检测,每28秒发送一次信息,防止断开连接
        var heartCheck = {
            timeout: 28000,
            timeoutObj: null,
            serverTimeoutObj: null,
            reset: function(){
                clearTimeout(this.timeoutObj);
                clearTimeout(this.serverTimeoutObj);
                return this;
            },
            start: function(){
                var self = this;
                this.timeoutObj = setTimeout(function(){
                    //这里发送一个心跳,后端收到后,返回一个心跳消息,
                    //onmessage拿到返回的心跳就说明连接正常
                    ws.send("HeartBeat");
                    self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
                        ws.close();     //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
                    }, self.timeout)
                }, this.timeout)
            }
        }
    
        var lockReconnect = false;  //避免ws重复连接
        var ws = null;          // 判断当前浏览器是否支持WebSocket
        var wsUrl = "ws://url"
        createWebSocket(wsUrl);   //连接ws
    
        //创建websocket
        function createWebSocket(url) {
            try{
                if('WebSocket' in window){
                    ws = new WebSocket(url);
                }else if('MozWebSocket' in window){  
                    ws = new MozWebSocket(url);
                }else{
                    layui.use(['layer'],function(){
                      var layer = layui.layer;
                      layer.alert("您的浏览器不支持websocket协议,建议使用新版谷歌、火狐等浏览器,请勿使用IE10以下浏览器,360浏览器请使用极速模式,不要使用兼容模式!"); 
                    });
                }
                initEventHandle();
            }catch(e){
                reconnect(url);
                console.log(e);
            }     
        }
    	
        //回调处理
        function initEventHandle() {
            // 成功连接
            ws.onopen = function () {
                heartCheck.reset().start();      //心跳检测重置
                console.log("连接成功"+new Date().toUTCString());
            };
            
            // 接收信息
            ws.onmessage = async function (event) {    //如果获取到消息,心跳检测重置
                heartCheck.reset().start();      //拿到任何消息都说明当前连接是正常的
                
                // 获取数据
                let data=JSON.parse(event.data)
                // 弹出下载框
                if(data.type=='down_excel'){
                    openDownloadDialog(data.url,data.file_name)
                }
                
            }
                
            ws.onclose = function () {
                reconnect(wsUrl);
                console.log("连接关闭!"+new Date().toUTCString());
            };
                
            ws.onerror = function () {
                reconnect(wsUrl);
                console.log("连接错误!");
            };
        }
    
        function reconnect(url) {
            if(lockReconnect) return;
            lockReconnect = true;
            setTimeout(function () {     //没连接上会一直重连,设置延迟避免请求过多
                createWebSocket(url);
                lockReconnect = false;
            }, 2000);
        }
    
        //弹框-接受到websocket传过来的下载数据时才会调用该函数
        function openDownloadDialog(url, saveName){
            //调用函数就说明后台已经异步处理完导出了,这时候派发事件重新渲染导出记录
            store.dispatch("_getLogs")
            window.open(url);
            Message.success('导出成功!')
        }
    }
    

    建立连接

    App.vue

    import initWebsocket from '@/utils/createWebSocket'
    export default {
      name: "App",
      mounted(){
        initWebsocket()
      }
    };
    

    起源地下载网 » 记录 |vuex与websoket应用

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元