值得一看
广告
彩虹云商城
广告

热门广告位

在JavaScript中,如何实现一个高效的发布-订阅(Pub/Sub)模式?

答案:一个高效的发布-订阅模式通过事件中心实现解耦,支持订阅、发布、取消及一次性监听。使用Object.create(null)提升性能,try-catch隔离错误,精确移除回调避免内存泄漏,适用于组件通信与状态通知场景。

在javascript中,如何实现一个高效的发布-订阅(pub/sub)模式?

实现一个高效的发布-订阅模式,关键在于轻量、解耦和性能。下面是一个简洁且实用的 JavaScript 实现,支持事件订阅、发布、取消订阅,并避免内存泄漏。

1. 基础结构:事件中心(EventEmitter)

使用一个对象存储事件类型与对应的回调函数列表,确保每个事件可以绑定多个监听器。

class PubSub {
constructor() {
this.events = Object.create(null); // 避免原型污染
}
// 订阅事件
on(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
}
// 发布事件
emit(event, data) {
if (!this.events[event]) return;
this.events[event].forEach(callback => {
try {
callback(data);
} catch (err) {
console.error(`Error in event "${event}" handler:`, err);
}
});
}
// 取消订阅
off(event, callback) {
if (!this.events[event]) return;
if (!callback) {
delete this.events[event];
return;
}
this.events[event] = this.events[event].filter(cb => cb !== callback);
}
}

2. 提升效率的关键点

为了让 Pub/Sub 更高效,注意以下几点:

小绿鲸英文文献阅读器

小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器40

查看详情
小绿鲸英文文献阅读器

  • 使用 Object.create(null):避免原型链干扰,提升查找性能。
  • 错误隔离:在 emit 中用 try-catch 包裹回调,防止一个回调出错影响其他监听器。
  • 支持取消特定监听器:允许传入具体 callback 来精确移除。
  • 批量清除:不传 callback 调用 off 时清空整个事件队列,便于资源回收。

3. 使用示例

这个模式非常适合组件通信、状态更新通知等场景。

立即学习“Java免费学习笔记(深入)”;

const bus = new PubSub();
// 订阅消息
bus.on('userLogin', user => {
console.log('欢迎用户:', user.name);
});
bus.on('userLogin', () => {
console.log('更新登录状态');
});
// 发布消息
bus.emit('userLogin', { name: 'Alice' });
// 取消某个订阅
const welcomeHandler = user => console.log('打招呼:', user.name);
bus.on('userLogin', welcomeHandler);
bus.off('userLogin', welcomeHandler); // 移除该监听

4. 可选优化:支持只监听一次

添加 once 方法,在回调执行后自动取消订阅。

once(event, callback) {
const wrapped = (...args) => {
callback.apply(this, args);
this.off(event, wrapped);
};
this.on(event, wrapped);
}

基本上就这些。这个实现足够轻量,适用于大多数前端或 Node.js 场景,既保证了性能,又具备良好的可维护性。

相关标签:

javascript java js 前端 node.js node app 回调函数 JavaScript Object NULL try catch 回调函数 JS 对象 事件
温馨提示: 本文最后更新于2025-10-06 05:37:06,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容