wo-user-part-uniapp/unisocket/unisocket.js

71 lines
2.0 KiB
JavaScript

const my = {
socket : undefined,
reconnecting: undefined,
listeners: {}
}
module.exports={
initSocket(url){
if (!my.socket || my.socket.readyState!==my.socket.OPEN && typeof(url)==='string') {
console.log('WebSocket connecting...')
my.socket = uni.connectSocket({
url: url.replace(/^http/, 'ws'),
complete: ()=>{}
})
my.socket.onOpen((res)=>{
console.log('WebSocket onOpen: ', res)
clearInterval(my.reconnecting)
delete my.reconnecting
})
my.socket.onClose((res)=>{
console.log('Websocket onClose: ', res)
if (!my.reconnecting)
my.reconnecting = setInterval(()=>{
console.log(new Date(), 'WebSocket reconnecting...')
this.initSocket()
}, 5000) // 每5秒尝试重连
})
my.socket.onError((err)=>{
console.log('Websocket onError: ', err)
})
my.socket.onMessage(({data})=>{ // 在这里统一分发消息
try {
let dataObj = JSON.parse(data)
console.log('WebSocket onMessage for skevent: ', dataObj.skevent)
let listeners = my.listeners[dataObj.skevent] || []
for (let listener of listeners) {
listener(dataObj)
}
}catch(exception){
console.log(new Date(), 'unknown message', data)
return
}
})
}
return my.socket
},
closeSocket(){
if (my.socket) my.socket.close()
setTimeout(()=>{
clearInterval(my.reconnecting)
delete my.reconnecting
}, 2000)
},
addListener(skevent, listener){
if (Array.isArray(my.listeners[skevent]) && typeof(listener)==='function') {
my.listeners[skevent].push(listener)
}else {
my.listeners[skevent]=[listener]
}
return this
},
sendObject(data){
if (typeof(data)!=='string'){
data=JSON.stringify(data)
}
if (my.socket && my.socket.readyState===my.socket.OPEN){
my.socket.send({data})
}
}
}