class wsRequest { constructor(time) { this.status = null; // websocket是否关闭 this.lockReconnect = false //避免重复连接 // this.url = url //心跳检测 this.timeout = time //多少秒执行检测 this.timeoutObj = null //检测服务器端是否还活着 this.reconnectTimeOutObj = null //重连之后多久再次重连 try { return this.initRequest() } catch (e) { this.reconnect(); } } initRequest() { this.socketTask = uni.connectSocket({ url: 'wss://' + uni.getStorageSync("wsServerUrl") + '/websocket/message/' + uni.getStorageSync( 'setUserName'), //接口地址。 success: () => { // 返回实例 return this.socketTask } }) this.socketTask.onOpen(res => { // 清除重连定时器 clearTimeout(this.reconnectTimeOutObj) // 开启检测 this.start() }) // 如果希望websocket连接一直保持,在close或者error上绑定重新连接方法。 this.socketTask.onClose((res) => { console.log(res, '连接关闭'); this.reconnect(); }) this.socketTask.onError((res) => { console.log(res, '连接错误'); this.reconnect(); }) this.socketTask.onMessage(res => { //接受任何消息都说明当前连接是正常的 this.reset(); if (res.data === 'all_Read') { uni.setStorageSync('msgData', null) } else if (res.data != 'ping') { uni.setStorageSync('msgData', res.data) } else { uni.setStorageSync('msgData', null) } }) } send(value) { return new Promise((resovle, reject) => { this.socketTask.send({ data: value, success: () => { resovle('发送成功') } }) }) } // reset和start方法主要用来控制心跳的定时。 reset() { // 清除定时器重新发送一个心跳信息 clearTimeout(this.timeoutObj); this.start(); } start() { this.timeoutObj = setTimeout(() => { //这里发送一个心跳,后端收到后,返回一个心跳消息, //onmessage拿到返回的心跳就说明连接正常 this.socketTask.send({ data: "ping" }); }, this.timeout) } // 重连 reconnect() { // 防止多个方法调用,多处重连 if (this.lockReconnect) { return; }; this.lockReconnect = true; console.log('准备重连'); //没连接上会一直重连,设置延迟避免请求过多 this.reconnectTimeOutObj = setTimeout(() => { // 重新连接 this.initRequest() this.lockReconnect = false; }, 4000); } // 手动关闭 close() { this.socketTask.close() } } module.exports = wsRequest