美文网首页
面试题之实现EventBus

面试题之实现EventBus

作者: 子夜照弦歌 | 来源:发表于2021-04-21 19:10 被阅读0次

实现一个类,首先在 constructor 里找一个地方去存消息列队,直接用一个对象存,然后在 on 方法里去注册事件,其实就是把传进来的函数保存到消息列队里去,之后,在 emit 方法里去调用,如果有,直接把消息列队里的方法拿出来,执行,并且传入参数,如果没有,直接略过

<div id="btn">点击这里触发消息</div>
btn.onclick = function(){
     eventBus.emit('sendMsg', this.innerText);
}
eventBus.on('sendMsg', (msg) => {
     console.log(`订阅的消息是:${msg}`)
})
class EventBusClass {
    constructor() {
        this.msgList = {}
    }
    on(msgName, fn) {
        // this.msgList[msgName] = fn;
        // 首先判断消息是不是保存过
        if (this.msgList.hasOwnProperty(msgName)) {
            // 如果存在,看看是不是一个函数
            if (typeof this.msgList[msgName] === 'function') {
                // 如果是,则变成数组
                this.msgList[msgName] = [this.msgList[msgName], fn]
            } else {
                // 如果是,则需要再原有的数组上把新的函数保存进去
                this.msgList[msgName] = [...this.msgList[msgName], fn]
            }
        } else {
            // 如果消息名称在事件队列里不存在,直接存储
            this.msgList[msgName] = fn
        }
    }
    emit(msgName, msg) {
        // 先判断消息名称是否存在
        if (!this.msgList.hasOwnProperty(msgName)) {
            return
        }

        // this.msgList[msgName](msg);
        // 判断是函数还是数组
        if (typeof this.msgList[msgName] === 'function') {
            // 函数的话直接执行
            this.msgList[msgName](msg)
        } else {
            this.msgList[msgName].map((fn) => {
                // 如果是数组,则需把数组取出来挨个执行
                fn(msg)
            })
        }
    }

    off(msgName) {
        if (!this.msgList.hasOwnProperty(msgName)) {
            return
        }
        delete this.msgList[msgName];
    }
}
const eventBus = new EventBusClass()
window.eventBus = eventBus

相关文章

  • EventBus源码解析

    知识点汇总: 一:EventBus框架概述 二:EventBus的注册实现原理 三:EventBus的事件分发实现...

  • 面试题之实现EventBus

    实现一个类,首先在 constructor 里找一个地方去存消息列队,直接用一个对象存,然后在 on 方法里去注册...

  • [Flutter]EventBus的使用和底层实现分析

    什么是EventBus EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,...

  • EventBus的使用

    什么是EventBus EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访问,...

  • EventBus

    一、EventBus的原理 EventBus是全局事件总线,底层通过Stream来实现;它可以实现不同页面的跨层访...

  • 组件间通信

    组件间通信 EventBus实现通信在Activity注册EventBus,在Activity写入消息订阅接收消息...

  • 一篇讲明白EventBus

    先说EventBus是什么: EventBus是 基于 订阅/发布 模式实现的 基于事件的异步分发处理系统。 ...

  • Android基础(40)EventBus

    1)说说EventBus作用,实现方式,代替EventBus的方式2)整体操作流程 参考链接: https://b...

  • eventbus 、rxbus

    ##引言 接触过EventBus和RxJava的都知道,可以用RxJava来实现EventBus,网上随便一搜,就...

  • 小程序系列--Event事件总线

    EventBus 在Android开发中,有个非常还有的工具就是EventBus,可以轻松实现任意组件之间的通信,...

网友评论

      本文标题:面试题之实现EventBus

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