乐趣区

关于小程序:分享微信小程序在appjs中全局管理websocket方案

微信凋谢社区有网友发问怎么在路由切换时放弃 websocket 连贯不中断?,我在答复中分享了我在理论我的项目中应用 websocket 的计划,这边整顿一下。

次要思路是在 app.js 中全局解决 websocket 的连贯和接管音讯,收到音讯后再把音讯转发到页面,理论用到音讯的页面接管音讯做后续解决。具体代码如下

要引入 mitt.js,百度一下,一个很小的文件(具体代码在文章最初)

app.js

const mitt = require('./utils/mitt').mitt
...
App({
    ...
    onLaunch: function () {
        let that = this
        that.globalData.bus = mitt()
        ...
        // 连贯 socket
        ...
        // 收到音讯的回调中
        if (msg.length > 0) {that.globalData.bus.emit('_socketMsg', msg)
        }
        ...
    }
    ...
})

要用到音讯的页面

const app = getApp()
...
Page({
    ...
    socketMsg: function(msg){// 理论解决收到的音讯},
    onShow: function () {
        let that = this
        app.globalData.bus.on('_socketMsg', that.socketMsg)
        ...
    },
    onHide: function () {
        let that = this
        app.globalData.bus.off('_socketMsg', that.socketMsg)
        ...
    },
    ...
})

附:mitt.js

function mitt(all) {all = all || Object.create(null);

  return {on(type, handler) {(all[type] || (all[type] = [])).push(handler);
    },
    off(type, handler) {if (all[type]) {all[type].splice(all[type].indexOf(handler) >>> 0, 1);
      }
    },
    emit(type, evt) {(all[type] || []).slice().map((handler) => {handler(evt);
      });
      (all['*'] || []).slice().map((handler) => {handler(type, evt);
      });
    }
  };
}

module.exports = {mitt: mitt}
退出移动版