出现场景
引入Jssdk时未能加载完成时,已经发出了请求并且该请求是需要调用本司客户端的Jssdk方法,此时服务就会报错;
研究了一波后使用node自带的的events.EventEmitter做监听,保存需要执行的方法,如果执行时,检测到Jssdk加载成功则直接调用;否则等待加载完成后,再调用之前的执行,先贴代码;
EventEmitter.js
const EventEmitter = require('events') //引入nodejs events模块
export const clientEmitter = new EventEmitter() //EventsEmitter实例
export const emitterMethods = (fn)=>{
if(window.client){ //JSSDK已经加载完成,直接执行fn
fn()//如果已经加载完成直接执行
}else{
clientEmitter.on('watch',()=>{ // 如果没有加载完,监听,待执行fn
fn()
})
}
}
待执行的方法,举例:登录成功存token
import { emitterMethods } from "utils/EventEmitter";
methods:{
login(){
login().then((res)=>{
let c_token = md5(res.token + '@token_c');//加密
emitterMethods(() => { //传入待执行的方法
jssdk.setStore({
key: 'c_token', // 唯一key
value: c_token,
success: function (res) {},
});
});
})
}
}
JSSDK加载完成时
import { clientEmitter } from "utils/EventEmitter";
created(){
jssdk.ready(()=>{
clientEmitter.emit('watch') //触发执行命令
})
}
demo 理解一下Api:
Node.js EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
EventEmitter 类
nodejs 的 events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装,使用时用 require 引入;
// 引入 nodejs events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
常用Api
- on(event,listener):为指定的事件注册一个监听器,接受一个字符串 event 和一个回调函数;
- once(event,listener):为指定的事件注册一个单次监听器(监听器最多只会触发一次,触发后立即解除该监听器)
- emit(event,[arg1],[arg2]…):按监听器的顺序执行每个监听器;
- addListener(event,listener):为指定事件添加一个监听器到监听器数组的尾部;
- removeLister(event,listener): 移除指定事件的某个监听器,监听器必须是已经注册过的监听器,接受两个参数,第一个是 事件名,第二个是 回调函数;
- removeAllListeners([event]): 移除所有事件的所有监听器,如果指定事件名,则移除该事件下的所有监听器;
- setMaxListeners(n): 设置最大可添加的监听器数量,默认10;
- listeners(event): 返回指定事件的监听器数组;
- emitter.listenerCount(event):返回 实例(eventEmitter) 指定事件的监听器数量 eventEmitter.listenerCount(’事件‘);
var events = require('events') // 引入
var eventEmitter = new events.EventEmitter() // 实例化
// 监听器回调1
var cb1 = function cb1() {
console.log('监听器 cb1 执行啦11111111111')
}
// 监听器回调2
var cb2 = function cb2() {
console.log('监听器 cb2 执行啦222222222222')
}
// 绑定 test_events 事件,处理函数为 cb1
eventEmitter.addListener('test_events', cb1)
// 绑定 test_events 事件,处理函数为 cb2
eventEmitter.on('test_events', cb2)
var eventListeners = eventEmitter.listenerCount('test_events')
console.log(`eventEmitter 的监听器监听连接事件数:${eventListeners}`)
// 触发 test_events 事件
eventEmitter.emit('test_events')
// 移除监绑定的 cb1 函数
eventEmitter.removeListener('test_events', cb1)
console.log('cb1 回调被移除')
// 触发 test_events
eventEmitter.emit('test_events')
eventListeners = eventEmitter.listenerCount('test_events')
console.log(`eventEmitter 的监听器监听连接事件数:${eventListeners}`)
输出:
eventEmitter 的监听器监听连接事件数:2
监听器 cb1 执行啦11111111111
监听器 cb2 执行啦222222222222
cb1 回调被移除
监听器 cb2 执行啦222222222222
eventEmitter 的监听器监听连接事件数:1