jessibuca入门2:Emitter类

这是一个自定义的事件发射器(Event Emitter)类,实现了 发布-订阅(Publish-Subscribe)模式 。它的主要作用是解耦各个模块(如播放器核心、UI、解码器),让它们通过事件进行通信,而不需要相互引用。

文件功能说明

该文件定义了一个 Emitter 类,包含以下核心方法:

  1. constructor (构造函数)
  • 初始化 this.events 用于存储事件。

  • 使用 Object.create(null) 创建一个 无原型的纯净对象 ,避免了与 Object.prototype 上的属性(如 toString )发生命名冲突,提高了安全性。

  1. on(name, fn, ctx) - 订阅事件
  • 注册一个事件监听器。

  • 参数 : name (事件名), fn (回调函数), ctx (上下文/this指向)。

  • 特点 :包含类型检查,确保 fn 是函数;支持链式调用。

  1. once(name, fn, ctx) - 订阅一次性事件
  • 注册一个只执行一次的监听器。

  • 实现 :包装原始回调,在执行前先调用 off 移除自己。

  1. emit(name, ...args) - 发布/触发事件
  • 触发指定名称的事件,并传递参数给所有订阅者。

  • 关键特性(异步) :当前代码中使用了 Promise.resolve().then(...) 。这意味着事件回调是 异步执行 的(微任务)。

  • 优点 :防止某个耗时的监听器阻塞当前的主线程执行流,提高页面响应性。

  • 注意 : emit 调用后,回调不会立即执行,而是会在当前同步代码执行完毕后才执行。

  1. off(name, callback) - 取消订阅
  • 移除事件监听器。

  • 灵活性 :

  • 不传参数:清空所有事件。

  • 只传 name :移除该事件名下的所有监听器。

  • 传 name 和 callback :移除特定的监听器(支持识别 once 包装过的函数)。

代码特点与潜在风险

这个实现相比原始版本做了很多优化(如参数检查、数组浅拷贝防止遍历时修改队列),但有一个显著特点需要注意:

  • 异步微任务执行 :

代码中显式使用了 Promise.resolve().then 。这在处理 UI 通知或非关键逻辑时很好,但在某些需要 同步反馈 的场景下可能会导致问题。

  • 例如 :如果你在 emit('changeData') 后立即读取数据,可能数据还没被监听器修改。
相关推荐
REDcker12 天前
web 端 H265 软解码实现原理与使用说明
前端·音视频·播放器·h265·解码·软解码
longzekai25 天前
最好用的Emby 第三方客户端 Yamby 1.6.6.18 更新!
播放器·家庭影院·nas·emby·数字视频·yabmy·蓝光高清
一只游鱼3 个月前
vue集成dplayer
前端·javascript·vue.js·播放器·dplayer
眠りたいです4 个月前
基于脚手架微服务的视频点播系统-播放控制部分
c++·qt·ui·微服务·云原生·架构·播放器
瘦瘦的追梦洋1 年前
播放器系列4——PCM重采样
ffmpeg·pcm·播放器·resample
黄金右肾1 年前
Qt之FFmpeg播放器设计(十七)
qt·ffmpeg·播放器
黄金右肾1 年前
Qt之简易音视频播放器设计(十五)
qt·播放器·qmediaplayer
音视频牛哥1 年前
Windows平台RTSP|RTMP播放器如何实时调节音量
大牛直播sdk·播放器·rtsp播放器·rtmp播放器·rtsp player·rtmp player·windows rtsp播放器
Mac分享吧1 年前
Infuse Pro for Mac全能视频播放器
经验分享·笔记·macos·音视频·mac·播放器·视频