美文网首页
vue中SignalR全局封装

vue中SignalR全局封装

作者: 不语u | 来源:发表于2021-11-26 16:03 被阅读0次

    一、SignalR

    是什么我就不多说了,可自行去官网查阅

    二、使用步骤

    1.安装signalr,无需安装其他如jquery之类的

    cnpm install @aspnet/signalr 
    

    2.新建一个名为signalR.js的文件

    import * as signalR from "@aspnet/signalr";
    export default {
      SR: {},
      //初始化连接
      initSR: function() {
        let that = this;
        if (!localStorage.userInfo) return;
        let userInfo = JSON.parse(localStorage.userInfo);
        // 1.获取系统中定义的baseURL
        let url = window.PLATFROM_CONFIG.baseURL.replace(/http:/g, "");
        // 2.初始化连接
        that.SR = new signalR.HubConnectionBuilder()
          .withUrl(url + "signalr", {
            accessTokenFactory: () => encodeURI(userInfo.encryptedAccessToken),
          })
          .configureLogging(signalR.LogLevel.Information)
          .build();
        // 3.携带参数
        that.SR.qs = {
          enc_auth_token: encodeURI(userInfo.encryptedAccessToken),
        };
        // 4.启动连接的方法
        async function start() {
          try {
            await that.SR.start();
            console.log("signaR连接成功");
          } catch (err) {
            console.log("err", err);
            setTimeout(start, 5000);
          }
        }
        // 5.关闭之后重连
        that.SR.onclose(async () => {
          await start();
        });
        // 6.启动连接
        start();
      },
      // 停止连接(这个方法好像没啥用,先放着吧)
      stopSR: function() {
        let that = this;
        async function stop() {
          try {
            await that.SR.stop();
            console.log("signaR退出成功");
          } catch (err) {}
        }
        stop();
      },
    };
    

    3.在main.js中引入并挂载到全局

    import signaR from "signaR的路径";
    Vue.prototype.signaR = signaR;
    

    4.初始化
    我的需求是登陆之后连接服务器,所以我将初始化连接(initSR)的步骤放在了登陆成功获取到token时

    this.signaR.initSR();
    

    但同时我又发现,当界面刷新时,由main.js中全局挂载的signaR会消失,所以需要在App.vue中再初始化一遍

      mounted() {
        // 初始化signaR连接
        this.signaR.initSR()
      },
    

    5.使用
    我的需求是订阅服务器中getNotification这个主题,当服务器那边任务处理完成时,就会给我发送一条消息,我拿到这条消息并根据消息内容进行下面的工作

      mounted() {
        this.signaR.SR.on('getNotification', function (notification) {
          // 接收后要做的事
          console.log('getNotification', notification)
        })
      }
    

    特别注意:当此组件生命周期结束时,记得销毁注册的这个方法,不然会导致重复触发上面这个回调(我尝试了官网中所用的off方法,无效,所以自己手动清空这个数组,有更好的方法麻烦也告知一下)

      destroyed() {
        // 手动销毁此主题,不然会反复订阅,反复触发getnotification
        this.signaR.SR.methods.getnotification = []
      },
    

    相关文章

      网友评论

          本文标题:vue中SignalR全局封装

          本文链接:https://www.haomeiwen.com/subject/fbqxxrtx.html