因业务须要,与后端进行websocket长连贯通信,通过钻研,决定应用sockjs-client和stompjs库,并进行了二次封装。
package.json版本:
"sockjs-client": "^1.5.1","stompjs": "^2.3.3",
socketManager.js:
import SockJS from 'sockjs-client';import Stomp from 'stompjs';import lodash from 'lodash';function subscribeCallBack(data, subscribes) { if (data) { let topic = data.headers.destination; let funces = subscribes.get(topic); funces.forEach((func) => { func(data); }); }}let clientManager = { client: null, connecting: false,//是否正在连接 subscribes: new Map(),//订阅列表 subscribe(topic, onMessage) { if (this.client != null && this.client.connected == true) { //已连贯状态 console.log('减少订阅 已连贯状态'); if (!this.subscribes.has(topic)) { this.client.subscribe(topic, (data) => subscribeCallBack(data, this.subscribes)); this.subscribes.set(topic, [onMessage]); } else { let funces = this.subscribes.get(topic); funces.push(onMessage); } } else { //未连贯状态 console.log('减少订阅 未连贯状态'); if (!this.subscribes.has(topic)) { this.subscribes.set(topic, [onMessage]); } else { let funces = this.subscribes.get(topic); funces.push(onMessage); } } }, subscribesAll() { console.log('订阅全副'); if (lodash.isEmpty(this.client) || this.client.connected != true) { return; } let subscribes = this.subscribes; for (let topic of subscribes.keys()) { this.client.subscribe(topic, (data) => subscribeCallBack(data, subscribes)); } }, disconnect() { console.log('断开连接'); if (lodash.isEmpty(this.client) || this.client.connected != true) { return; } this.client.disconnect(); this.subscribes = new Map(); }, connect(onSuccess, onDisconnect) { try { if (this.connecting == true) { console.log('正在连接中'); return; } this.connecting = true; if (lodash.isEmpty(this.client) || this.client.connected != true) {//未连贯状态 let socket = new SockJS('/bond/notification', null, { timeout: 6000 }); let stompClient = Stomp.over(socket); stompClient.debug = null; console.log('开始连贯'); stompClient.connect ({}, () => { this.client = stompClient; console.log('连贯胜利'); this.subscribesAll();//连贯胜利后开始订阅所有内容 if (onSuccess != null && onSuccess != undefined) { onSuccess(); }; }, (error) => this.errorCallBack(error, onSuccess, onDisconnect) ); } else if (this.client != null && this.client.connected == true) {//已连贯状态间接调用回调 onSuccess(); } } catch (err) { console.log('连贯异样', err); } finally { this.connecting = false; } }, errorCallBack(error, onSuccess, onDisconnect) { console.log('连贯失败'); if (onDisconnect != null && onDisconnect != undefined) { onDisconnect(); } setTimeout(() => {//主动重连 console.log('从新连贯中'); this.connect(onSuccess, onDisconnect); }, 10000); },};export default clientManager;
连贯形式:
useEffect(()=>{ socketmanager.connect(); return () => { socketmanager.disconnect(); };})
订阅形式:
useEffect(() => { let topic = `/topic/notification`; socketmanager.subscribe(topic, (data) => { if (data) { //do something } }) }, [])
如果有发现程序启动的时候报这个谬误:
须要批改下connect中央,在申请胜利后再进行connect,以确保connect在程序启动实现之后再被调用,如果还是不行,把曾经关上过的程序页面关掉,清空浏览器缓存再试试。具体起因临时未知,有大佬晓得的通知一下,哈哈~
作者:点墨
版权:本文版权归作者所有
转载:欢送转载,但未经作者批准,必须保留此段申明;必须在文章中给出原文连贯;否则必究法律责任