events.EventEmitter监听与派发

2 篇文章 0 订阅

出现场景

引入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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值