一、在utils文件夹新建一个websocket.js
import { BASE_WS_URL } from "@/api/request";
class webSocketClass {
constructor(params, interval) {
this.url = BASE_WS_URL + this.objectToQuery(params);
this.data = null;
this.isCreate = false;
this.isConnect = false;
this.isInitiative = false;
this.heartbeatInterval = interval;
this.heartbeatTimer = null;
this.reconnectTimer = null;
this.socketExamples = null;
this.againTime = 3;
}
initSocket() {
const _this = this;
this.socketExamples = uni.connectSocket({
url: _this.url,
method: "GET",
success: (res) => {
_this.isCreate = true;
},
fail: (rej) => {
console.error(rej);
_this.isCreate = false;
},
});
this.createSocket();
}
createSocket() {
console.log("WebSocket 开始初始化");
if (this.isCreate) {
try {
this.socketExamples.onOpen(() => {
console.log("WebSocket 连接成功");
this.isConnect = true;
clearInterval(this.heartbeatTimer);
clearTimeout(this.reconnectTimer);
this.heartbeatCheck()
});
this.socketExamples.onMessage((res) => {
uni.$emit("message", res);
});
this.socketExamples.onClose(() => {
console.log("WebSocket 关闭了");
this.isConnect = false;
this.reconnect();
});
this.socketExamples.onError((res) => {
console.log("WebSocket 出错了");
this.reconnect();
});
} catch (error) {
console.warn(error);
}
} else {
console.warn("WebSocket 初始化失败!");
}
}
sendMsg(value) {
const param = JSON.stringify(value);
return new Promise((resolve, reject) => {
this.socketExamples.send({
data: param,
success() {
console.log("消息发送成功");
resolve(true);
},
fail(error) {
console.log("消息发送失败");
reject(error);
},
});
});
}
onSocketMsg(value) {
return new Promise((resolve, reject) => {
this.socketExamples.send({
data: param,
success() {
console.log("消息发送成功");
resolve(true);
},
fail(error) {
console.log("消息发送失败");
reject(error);
},
});
});
}
heartbeatCheck() {
console.log("开启心跳");
this.data = { state: 1, method: "heartbeat" };
this.heartbeatTimer = setInterval(() => {
this.sendMsg(this.data);
}, this.heartbeatInterval * 1000);
}
reconnect() {
clearInterval(this.heartbeatTimer);
clearTimeout(this.reconnectTimer);
if (!this.isInitiative) {
this.reconnectTimer = setTimeout(() => {
this.initSocket();
}, this.againTime * 1000);
}
}
closeSocket(reason = "关闭") {
const _this = this;
this.socketExamples.close({
reason,
success() {
_this.data = null;
_this.isCreate = false;
_this.isConnect = false;
_this.isInitiative = true;
_this.socketExamples = null;
clearInterval(_this.heartbeatTimer);
clearTimeout(_this.reconnectTimer);
console.log("关闭 WebSocket 成功");
},
fail() {
console.log("关闭 WebSocket 失败");
},
});
}
objectToQuery() {
let obj = arguments[0];
let prefix = arguments[1];
if (typeof obj !== "object") return "";
const attrs = Object.keys(obj);
return attrs.reduce((query, attr, index) => {
if (index === 0 && !prefix) query += "?";
if (typeof obj[attr] === "object") {
const subPrefix = prefix ? `${prefix}[${attr}]` : attr;
query += this.objectToQuery(obj[attr], subPrefix);
} else {
if (prefix) {
query += `${prefix}[${attr}]=${obj[attr]}`;
} else {
query += `${attr}=${obj[attr]}`;
}
}
if (index !== attrs.length - 1) query += "&";
return query;
}, "");
}
}
export default webSocketClass;
二、在需要使用的页面上引入webSocketClass并初始化
import webSocketClass from "@/utils/webSocket";
export default{
data(){
return{
socketObj:null,
params:null
}
}
onLoad(){
this.socketObj = new webSocketClass(params,300);
this.socketObj.initSocket();
uni.$on("message", (data) => {
console.log('data',data)
});
},
deactivated() {
this.socketObj.closeSocket();
},
}