vue内写websocket实时订阅

首先安装插件reconnecting-websocket

或者不安装也可以,这个插件只是在断连之后可以重新连接

引入插件
import ReconnectingWebSocket from 'reconnecting-websocket';

js文件:

export const WebSocketClass = (url, params, successFn, errorFn, closeFn) => {
    if (window.location.protocol == 'http:') {
        url = 'ws://' +  url;
    } else {
        url = 'wss://' + url;
    }
    console.log(url, 'websocket路径2')

    const options = {
        // WebSocket: WebSocket, // 允许你指定一个自定义的 WebSocket 构造函数,通常用于在不同环境中使用不同的 WebSocket 实现
        connectionTimeout: 10000, // 连接初始尝试的超时时间 10000
        maxRetries: 100, // 连接失败后,最大允许的重试次数 100
        maxReconnectionDelay: 10000, // 这是连接重试之间的最大延迟
        minReconnectionDelay: 1000, // 连接重试之间的最小延迟
        reconnectionDelayGrowFactor: 1, // 用来控制每次重试之间延迟的增长速度
        automaticOpen: params.automaticOpen || false,  // 自动连接
        debug: false // enables debug output
    };


    const ws = new ReconnectingWebSocket(url, [], options);
    // 没有引入插件的话用下面的
    // let ws = new WebSocket(url);
    ws.addEventListener('open', () => {
        console.log('进入websocket');
        // 将消息发送到服务端
        if (ws.readyState == 1) {
            ws.send(JSON.stringify(params));
            console.log('发送数据:', JSON.stringify(params));
        } else {
            console.log('websocket未连接,请重新刷新页面');
        }
    });
    
    // 当客户端收到服务端发来的消息时,触发onmessage事件,参数e.data包含server传递过来的数据
    ws.addEventListener('message', event => {
        if (event.data) {
            successFn(JSON.parse(event.data));
        }
    });
    // 当客户端收到服务端发送的关闭连接请求时,触发onclose事件
    ws.addEventListener('close', () => {
        console.log('WebSocket 连接已关闭');
        closeFn && closeFn();
    });
    // 如果出现连接、处理、接收、发送数据失败的时候触发onerror事件
    ws.addEventListener('error', error => {
        console.error('WebSocket 错误:', error);
        errorFn && errorFn(error);
    });

    window.onbeforeunload = () => {
        console.log('离开当前页面')
        ws.close();
    };

    return ws;
};

export const socketSend = (socket, params) => {
    if (socket.readyState == 1) {
        socket.send(params);
    } else {
        console.log('预结算websocket未连接,请重新刷新页面');
    }
};

总共两个方法,WebSocketClass 和 socketSend

WebSocketClass 是初始化调用的方法,

  • url: 订阅的地址
  • params:订阅传的参数
  • successFn:订阅成功执行的方法
  • errorFn:订阅失败执行的方法
  • closeFn:订阅关闭执行的方法

调用:

this.websock = WebSocketClass(url, params, (par)=> {
//   成功方法 successFn(par)
}, (err)=> {
//    失败方法 errorFn()
}, (close)=> {
//	closeFn()
})

正常情况只需要上面这一个方法,但是如果自己想在某个时间点换参数换,就需要重新发送请求,就用到socketSend方法。这个方法有两个参数:

  • socket:表示接收WebSocketClass的实例,也就是上面的this.websock
  • params:是需要重新修改的参数。

这样就能指定到上次发送请求的实例上面重新发送了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值