| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- class Socket {
- constructor(link) {
- // 初始化socket
- if (link.constructor === WebSocket) {
- this.socket = link;
- } else {
- this.socket = new WebSocket(link);
- }
- // this.socket.binaryType = 'arraybuffer';
- this.doOpen();
- // 连接状态的标识符
- this.readyState = this.socket.readyState;
- // 订阅/发布模型
- this._events = {
- // 订阅的事件 : 发布的方法
- };
- // 定时验证的标识符
- this.heartBeatTimer = null;
- }
- // 执行socket并发布事件
- doOpen() {
- this.afterOpenEmit = [];
- // 执行socket连接 并初始化验证请求
- this.socket.addEventListener("open", evt => this.onOpen(evt));
- // 接收socket数据
- this.socket.addEventListener("message", evt => this.onMessage(evt));
- // 关闭socket连接
- this.socket.addEventListener("close", evt => this.onClose(evt));
- // 请求发生错误
- this.socket.addEventListener("error", err => this.onError(err));
- }
- // 发布后通知订阅者
- Notify(entry) {
- // 检查是否有订阅者 返回队列
- const cbQueue = this._events[entry.Event];
- if (cbQueue && cbQueue.length) {
- for (let callback of cbQueue) {
- if (callback instanceof Function) callback(entry.Data);
- }
- }
- }
- // 请求数据的方法
- onOpen(evt) {
- // 每隔20s检查连接
- // this.heartBeatTimer = setInterval(() => this.send({
- // 'cmd': 'ping',
- // 'args': ''
- // }), 20000);
- // 通知订阅
- this.Notify({Event: 'open', Data : evt});
- }
- /**
- * 订阅所有的数据
- * @param {array|object} datas 订阅参数集合
- */
- send(datas) {
- if (datas.constructor != Array) {
- datas = [datas];
- }
-
- for (let item of datas) {
- this.socket.send(JSON.stringify(item));
- }
- }
- onMessage(evt) {
- try {
- // 解析推送的数据
- const data = JSON.parse(evt.data);
- // 通知订阅者
- this.Notify({
- Event: 'message',
- Data: data
- });
- } catch (err) {
- console.error(' >> Data parsing error:', err);
- // 通知订阅者
- this.Notify({
- Event: 'error',
- Data: err
- });
- }
- }
- // 添加事件监听
- on(name, handler) {
- this.subscribe(name, handler);
- }
- // 取消订阅事件
- off(name, handler) {
- this.unsubscribe(name, handler);
- }
- // 订阅事件的方法
- subscribe(name, handler) {
- if (this._events[name]) {
- this._events[name].push(handler); // 追加事件
- } else {
- this._events[name] = [handler]; // 添加事件
- }
- }
- // 取消订阅事件
- unsubscribe(name, handler) {
- let start = this._events[name].findIndex(item => item === handler);
- // 删除该事件
- this._events[name].splice(start, 1);
- }
- checkOpen() {
- return this.readyState >= 2;
- }
- onClose(evt) {
- this.Notify({Event: 'close', Data : evt});
- }
- onError(err) {
- this.Notify({Event: 'error', Data : err});
- }
- emit(data) {
- return new Promise((resolve) => {
- this.send(JSON.stringify(data));
- this.on('message', function (data) {
- resolve(data);
- });
- });
- }
- doClose() {
- this.socket.close();
- }
- destroy() {
- if (this.heartBeatTimer) {
- clearInterval(this.heartBeatTimer);
- this.heartBeatTimer = null;
- }
- this.doClose();
- this._events = {};
- this.readyState = 0;
- this.socket = null;
- }
- }
- export default Socket
|