IT教程 ·

小程序websocket心跳库——websocket-heartbeat-miniprogram

硬核抠门程序员,每天程序为小学生出数学题!

媒介

在16年的时刻由于项目接触到websocket,然后对心跳重连做了一次总结,写了篇博客,然后18年对之前github上的demo代码举行了再次开发和开源,终究封装成库。以下:

  • 博客:
  • github:
  • npm:

在2020年也就是今年初,同事发起说能够斟酌兼容一下小程序,心想也挺好的。便有了本日的 websocket-heartbeat-miniprogram,此次基于之前的代码新建了一个项目,只做小程序的版本,由于涉及到种种小程序以及相干框架的兼容,以为照样单独出一个包,更专注一点。

引见

websocket-heartbeat-miniprogram基于小程序的websocket相干API举行封装,重要目标是保证客户端websocket与效劳端衔接状况。该程序有心跳检测及自动重连机制,当收集断开或许后端效劳问题形成客户端websocket断开,程序会自动尝试从新衔接直到再次衔接胜利。兼容市面上大部分小程序微信,百度,支付宝等,只需都是一致的小程序weboscket-API范例。也支撑小程序框架比方Taro等。无论如何,营业是须要一层心跳机制的,不然一些情况下会丧失衔接致使功用没法运用。

用法

装置

npm install --save websocket-heartbeat-miniprogram

引入运用

import WebsocketHeartbeat from 'websocket-heartbeat-miniprogram';
WebsocketHeartbeat({
    miniprogram: wx,
    connectSocketParams: {
        url: 'ws://xxx'
    }
})
    .then(task => {
        task.onOpen = () => {//钩子函数
            console.log('open');
        };
        task.onClose = () => {//钩子函数
            console.log('close');
        };
        task.onError = e => {//钩子函数
            console.log('onError:', e);
        };
        task.onMessage = data => {//钩子函数
            console.log('onMessage', data);
        };
        task.onReconnect = () => {//钩子函数
            console.log('reconnect...');
        };
        task.socketTask.onOpen(data => {//原生实例注册函数,重连后丧失
            console.log('socketTask open');
        });
        task.socketTask.onMessage(data => {//原生实例注册函数,重连后丧失
            console.log('socketTask data');
        });
    })

本程序内部老是运用小程序connectSocket要领举行socket衔接,假如socket断开,本程序内部会再次实行小程序的connectSocket要领,以此来从新竖立衔接,重连都邑竖立新的小程序socket实例。

WebsocketHeartbeat要领返回一个promise,返回的task对象是本程序的一个实例,供应了onOpen,onClose,onError,onMessage,onReconnect等钩子函数。也暴露了小程序自身的实例(socketTask),task.socketTask就是小程序connectSocket返回的实例,而task.socketTask是小程序的原生实例,它们经由过程onXXX要领传递函数举行监听注册,在socket重连今后,内部从新经由过程connectSocket新建实例,将会返回新的小程序原生实例,因而之前经由过程socketTask.onXXX注册的这些函数将会丧失。而本程序内部供应的钩子函数重连上今后依旧有用。大部分情况下引荐就运用本程序的钩子函数。

支付宝小程序差别

支付宝小程序只允许同时存在一个socket衔接,原生的API也和其他小程序有一点小差别,本程序已做了兼容,然则照样要注意支付宝只允许竖立一个socket,假如竖立多个socket,前面的socket都邑被体系封闭,一定要经由过程本程序实例的task.close封闭旧的socket,不然程序会一向重连,致使一切socket互相争执没法运用。

商定

1.只能经由过程前端主动封闭socket衔接

假如须要断开socket,应当实行task.close()要领。假如后端想要封闭socket,应当下发一个音讯,前端推断此音讯,前端再挪用task.close()要领封闭。由于无论是后端挪用close照样由于其他缘由形成的socket封闭,前端的socket都邑触发onClose事宜,程序没法推断是什么缘由致使的封闭。因而本程序会默许尝试重连。

import WebsocketHeartbeat from 'websocket-heartbeat-miniprogram';
WebsocketHeartbeat({
    miniprogram: wx,
    connectSocketParams: {
        url: 'ws://xxxx'
    }
})
    .then(task => {
        task.onMessage = data => {
            if(data.data == 'close') task.close();//封闭socket而且,不再重连
        };
    })

2.后端对前端心跳的反应

前端发送心跳音讯,后端收到后,须要马上返回相应音讯,后端相应的音讯能够是任何值,由于本程序并不处置惩罚和推断相应的心跳音讯,而只是在收到任何音讯后,重置心跳,由于收到任何音讯就申明衔接是一般的。因而本程序收到任何后端返回的音讯都邑重置心跳倒计时,以此来削减不必要的要求,削减效劳器压力。

API

概况参考:

结语

程序已经由单元测试,也在百度,支付宝,微信等小程序当中现实测试和基于Taro测试。程序历久保护,发明兼容问题或许程序问题,愿望获得issue反应!

我一个二本大学是如何校招拿到阿里offer的

参与评论