其他分享
首页 > 其他分享> > xiangmu--

xiangmu--

作者:互联网

## 课堂笔记
### 一、问题列表做了缓存处理后,如何让从首页进去的问题列表取消之前的缓存? ```javascript beforeRouteLeave(to,from,next){     // 导航离开该组件的对应路由时调用     // 可以访问组件实例 `this`     console.log(to)     if(to.name!=='myQuestionDetail') {         this.searchQAData= {                 curPage:0,                 questionTypeId:1,                 question:''         };         this.getQuestionList();     }     next(); },
beforeRouteUpdate(to, from, next){             next();         }          ```
### 二、交流数字的实时更新
#### 2.1 通过在store里添加 chatBadgeNum来记录底栏交流数字  * 添加函数名为UpdateChatBadge的相关mutations和 actions方法 * 在 src/components/tabBar 通过辅助函数mapState获取到 状态值 chatBadgeNum ...mapState(['chatBadgeNum'])
#### 2.2  通过webscoket建立ws服务,握手成功以后就可以保持通信
 在src/common/webSocket.js对文件进行封装
 注意: window.socketServer 用来存储websocket对象实例
功能包括:
1. 建立websocket服务,保持通信 2. 异常重连ws 3. 心跳检测 ```javascript   //心跳检测 var heartCheck = {     timeout: 3000, //每隔三秒发送心跳     num: 3,  //3次心跳均未响应重连     timeoutObj: null,     reset: function(){//接收成功一次推送,就将心跳检测的倒计时重置为30秒         clearTimeout(this.timeoutObj);//重置倒计时         this.start();     },     start: function(){//启动心跳检测机制,设置倒计时30秒一次         this.timeoutObj = setTimeout(function(){            //这里发送一个心跳,后端收到后,返回一个心跳消息,             //onmessage拿到返回的心跳就说明连接正常             var userId = localStorage.getItem('userId');             if(!userId){                 return;             }             window.socketServer.send(JSON.stringify({                 photographerObjectId:'',                 type:'6',                 leavingContent:'',                 photographerId:userId  //留言摄影师编号             })); //给后端发送信息         },this.timeout)     }     //onopen连接上,就开始start及时,如果在定时时间范围内,onmessage获取到了服务端消息,     //就重置reset倒计时,距离上次从后端获取消息30秒后,执行心跳检测,看是不是断了。 }
/**建立连接 */ function createWSConnect(path){     var _store = this;     try {         if (typeof WebSocket === "undefined") {              alert("您的浏览器不支持socket");             return;         }         return new Promise((resolve,reject)=>{             // 实例化socket             var socket = new WebSocket(path);             // 监听socket连接             socket.onopen = function(){                 console.log("socket连接成功,握手成功!!!");                 // _store.dispatch('updateSocket',socket);                 window.socketServer = socket;                 resolve(socket);                 //心跳检测启动                 heartCheck.start();  //订阅业务发送之后启动心跳检测             };             socket.onclose = function (e) {                 console.log('websocket 断开: ' + e.code + ' ' + e.reason + ' ' + e.wasClean)                 console.log(e);                 reconnect(path);               }
            // 监听socket错误信息             socket.onerror = function(){                 socket.close();                 reject();                 console.log("wesocket连接错误");                 reconnect(path);             };               //监听socket消息               //如果获取到消息,心跳检测重置               //拿到任何消息都说明当前连接是正常的             socket.onmessage = function(res){                  //心跳检测重置                 var data = res.data;                 if(data==1) {                     //接收一次后台推送的消息,即进行一次心跳检测重置                     heartCheck.reset();                 } else {                     data = JSON.parse(res.data);                     updateMsgForType.call(_store,data);                 }                               };         })     } catch(e) {         reconnect(path);     } }
//重新建立链接 reconnect.lockReconnect = false;//避免重复连接 reconnect.timer = ''; function reconnect(url) {     if (reconnect.lockReconnect) return;     reconnect.lockReconnect = true;
    reconnect.timer && clearTimeout(reconnect.timer);     //没连接上会一直重连,设置延迟避免请求过多     reconnect.timer = setTimeout(function () {              createWSConnect(url);         reconnect.lockReconnect = false;     }, 4000); }

function updateMsgForType(data){     if(data.error){         $toast.show(data.error, 4000);         return;                  }     this.dispatch('UpdateChatBadge',{count:data.count})     switch(data.type){         case '0':  // 0 一对一交流文字             this.dispatch('communication/addOneToOne',data.siteComm)         break;         case '1': //1 一对一交流图片             this.dispatch('communication/addOneToOne',data.siteComm)         break;         case '2': //2  未读总条数          break;         case '3': //撤回被删除的信息             this.dispatch('communication/withdrawOneToOne',{count:data.siteComm})
        break;         case '4': //单条代表删除一对一信息             this.dispatch('communication/delOneToOne',data.siteComm)         break;         case '5': //批量删除一对一信息             this.dispatch('communication/delAllOneToOne',data.siteComm)         break;     } } export default createWSConnect;
```
#### 2.3 在工具函数里封装好发送的函数 
```javascript     websocktSend(paramsObj){     //这个是用来向后端websocket发送信息,发送之前需要先判断是否还处理链接状态     var userId = localStorage.getItem('userId');     var sendMsg = ()=>{       window.socketServer.send(JSON.stringify(paramsObj)); //给后端发送信息     }     if(window.socketServer.readyState==1){       sendMsg();     } else {       // 这里的this是$store,传递进来的       webSocket.call(this,wsconPath[sceneParam]+userId).then(()=>{           sendMsg();         });     }   },
``` #### 2.4 在工具函数统一设置发送的逻辑
 如果已经链接 就直接发送数据,如果检测ws已经断开,需要每次重新链接webscoket服务
common/utils/utils.js ```javascript import webSocket from 'common/webSocket.js'; ....
  websocktSend(paramsObj){     //这个是用来向后端websocket发送信息,发送之前需要先判断是否还处理链接状态     var userId = localStorage.getItem('userId');     var sendMsg = ()=>{       window.socketServer.send(JSON.stringify(paramsObj)); //给后端发送信息     }     if(window.socketServer.readyState==1){       sendMsg();     } else {       // 这里的this是$store,传递进来的       webSocket.call(this,wsconPath[sceneParam]+userId).then(()=>{           sendMsg();         });     }   },
``` #### 2.5  在首页建立与ws的服务 import utils from "common/utils/utils.js";
注意这里 我需要把store对象作为作用域传递进去
 //登陆成功以后就与后端websocket链接服务器链接
utils.websocktSend.call(this.$store,{     photographerObjectId:'',     type:'2',     leavingContent:'',     photographerId:this.userId  //留言摄影师编号 });










标签:function,xiangmu,socket,userId,reconnect,心跳,data
来源: https://www.cnblogs.com/laneyfu/p/12526721.html