小程序websocket心跳库(websocket-heartbeat-miniprogram)

 更新时间:2020年02月23日 10:26:36   作者:子慕大诗人  
这篇文章主要介绍了小程序websocket心跳库(websocket-heartbeat-miniprogram),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在16年的时候因为项目接触到websocket,而后对心跳重连做了一次总结,写了篇博客,而后18年对之前github上的demo代码进行了再次开发和开源,最终封装成库。如下:

github: https://github.com/zimv/websocket-heartbeat-js
npm: https://www.npmjs.com/package/websocket-heartbeat-js

在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

详情参考: https://github.com/zimv/websocket-heartbeat-miniprogram

结语

程序已经经过单元测试,也在百度,支付宝,微信等小程序之中实际测试和基于Taro测试。程序长期维护,发现兼容问题或者程序问题,希望得到issue反馈!

到此这篇关于小程序websocket心跳库(websocket-heartbeat-miniprogram)的文章就介绍到这了,更多相关小程序websocket心跳库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法

    使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法

    sticky组件,通常应用于导航条或者工具栏,当网页在某一区域滚动的时候,将导航条或工具栏这类元素固定在页面顶部或底部,方便用户快速进行这类元素提供的操作
    2016-03-03
  • 通过修改360抢票的刷新频率和突破8车次限制实现方法

    通过修改360抢票的刷新频率和突破8车次限制实现方法

    这篇文章主要介绍了通过修改360抢票的刷新频率和突破8车次限制实现方法的相关资料,现在刷票工具很多,这里就举一例修改,增加抢票频率及突破8车次限制,需要的朋友可以参考下
    2017-01-01
  • BootStrap实用代码片段之一

    BootStrap实用代码片段之一

    这篇文章主要为大家详细介绍了BootStrap实用代码片段之一,总结在使用BootStrap中遇到的问题,并记录解决方法,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • JS实现随机抽取三人

    JS实现随机抽取三人

    这篇文章主要为大家详细介绍了JS实现随机抽取三人,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 利用JavaScript实现防抖节流函数的示例代码

    利用JavaScript实现防抖节流函数的示例代码

    在开发中我们经常会遇到一些高频操作,比如:鼠标移动,滑动窗口,键盘输入等等,节流和防抖就是对此类事件进行优化,降低触发的频率,以达到提高性能的目的。本文就教大家如何实现一个让面试官拍大腿的防抖节流函数,需要的可以参考一下
    2022-08-08
  • JavaScript计算出现精度丢失问题的解决方法

    JavaScript计算出现精度丢失问题的解决方法

    Javascript作为一门大型编程语言,在日常开发中难免会涉及到大量的数学计算,然而,浮点数在计算过程中可能出现精度的问题,下面我们就来学习一下Javascript中高精度计算及其相关知识吧
    2023-11-11
  • JavaScript中获取纯正的undefined的方法

    JavaScript中获取纯正的undefined的方法

    这篇文章主要介绍了JavaScript中获取纯正的undefined的方法的相关资料,需要的朋友可以参考下
    2016-03-03
  • 微信小程序实现给嵌套template模板传递数据的方式总结

    微信小程序实现给嵌套template模板传递数据的方式总结

    这篇文章主要介绍了微信小程序实现给嵌套template模板传递数据的方式,结合实例形式总结分析了微信小程序嵌套template模板的定义、调用、参数传递及相关使用技巧,需要的朋友可以参考下
    2017-12-12
  • 数组Array进行原型prototype扩展后带来的for in遍历问题

    数组Array进行原型prototype扩展后带来的for in遍历问题

    不同的程序语言都有多种循环语句,而且功能是差不多的,当然使用场合还是有些区别的,比如for与for in,for in比较好用,它不需要预先知道对象属性的长度。
    2010-02-02
  • JavaScript 异步时序问题

    JavaScript 异步时序问题

    这篇文章主要介绍了JavaScript 异步时序问题,帮助大家更好的理解和学习JavaScript,感兴趣的朋友可以了解下
    2020-11-11

最新评论