From b92876fb09a791f22c0012470efb1286432a2a7f Mon Sep 17 00:00:00 2001 From: Luk Date: Mon, 16 Sep 2024 15:03:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E6=84=8F=E5=88=B0=EF=BC=8C=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E6=98=BE=E7=A4=BA=E4=BB=8D=E7=84=B6=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E7=9D=80=20socket=EF=BC=8C=E4=BD=86=E5=90=8E=E5=8F=B0=E5=8D=B4?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E4=B8=BA=E4=B8=8D=E6=98=AF=20OPEN=E3=80=82?= =?UTF-8?q?=E6=89=80=E4=BB=A5=E6=8A=8A=20if=20=E6=94=B9=E6=88=90=20try.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unisocket.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/unisocket.js b/unisocket.js index 1701716..30e986b 100644 --- a/unisocket.js +++ b/unisocket.js @@ -4,20 +4,23 @@ const my = { heartbeating: undefined, listeners: {}, heartbeatInterval: 20000, - reconnectInterval: 5000 + reconnectInterval: 5000, } export default { isAlive () { - return my.socket && (my.socket.readyState === my.socket.OPEN) + return my.socket && my.socket.readyState === my.socket.OPEN }, + initSocket ({ url, relogin = false, stateManager = {} } = {}) { if (!my.socket || (my.socket.readyState !== my.socket.OPEN && typeof url === 'string')) { console.log({ _at: new Date().toJSON(), about: `WebSocket is connecting to ${url}...` }) + my.socket = uni.connectSocket({ url: url.replace(/^http/, 'ws'), - complete: () => { }, + complete: () => {}, }) + my.socket.onOpen((res) => { console.log({ _at: new Date().toJSON(), about: 'WebSocket onOpen: ', res }) stateManager.socketAlive = true @@ -39,6 +42,7 @@ export default { } }, my.heartbeatInterval) // 定期发送心跳,避免被关闭 }) + my.socket.onClose((res) => { console.log({ _at: new Date().toJSON(), about: 'Websocket onClose: ', res }) stateManager.socketAlive = false @@ -48,10 +52,12 @@ export default { this.initSocket({ url, relogin: true, stateManager }) }, my.reconnectInterval) // 定时尝试重连 }) + my.socket.onError((err) => { console.log({ _at: new Date().toJSON(), about: 'Websocket onError: ', err }) stateManager.socketAlive = false }) + my.socket.onMessage(({ data }) => { // 在这里统一分发消息(用户端通常不需要返回结果给服务器,因此不用 rpc 模式,而用 event 模式。 try { @@ -69,6 +75,7 @@ export default { } return this }, + closeSocket () { if (my.socket) my.socket.close() setTimeout(() => { @@ -76,11 +83,13 @@ export default { delete my.reconnecting }, 2000) }, + initListener (skevent, listener) { // 当该 skevent 尚不具有任何 listener 时,添加本 listener my.listeners[skevent]?.length > 0 || this.addListener(skevent, listener) return this }, + addListener (skevent, listener) { if (Array.isArray(my.listeners[skevent]) && typeof listener === 'function') { my.listeners[skevent].push(listener) @@ -89,12 +98,14 @@ export default { } return this }, + countListener (skevent) { if (Array.isArray(my.listeners[skevent])) { return my.listeners[skevent].length } return 0 }, + sendObject (dataObj) { if (my.socket && my.socket.readyState === my.socket.OPEN) { my.socket.send({