js & Event Bus

global event handler (broadcast / trigger / emit / listen )

// 实现一个 EventBus类,这个类包含以下方法:
// on(监听事件,该事件可以被触发多次)
// once(也是监听事件,但只能被触发一次)
// fire(触发指定的事件)
// off(移除指定事件的某个回调方法或者所有回调方法) // 解题思路: class 存储 evnets, 按类型分别处理 once class EventBus {
constructor() {
this.eventBus = {};
}
on(name, callback) {
this.eventBus[name] = {
callback,
once: false,
};
}
once(name, callback) {
this.eventBus[name] = {
callback,
once: true,
};
}
off(name) {
let keys = Object.keys(this.eventBus);
if (keys.includes(name)) {
delete this.eventBus[name];
}
}
fire(name, person) {
// dispatchEvent
let keys = Object.keys(this.eventBus);
if (keys.includes(name)) {
let fun = this.eventBus[name].callback;
let once = this.eventBus[name].once;
// pass data
fun(person);
if (once) {
delete this.eventBus[name];
}
}
}
}

demo


const event = new EventBus(); const log = console.log; event.on("drink", (person) => {
log(person + "喝水");
}); event.on("eat", (person) => {
log(person + "吃东西");
}); event.once("buy", (person) => {
log(person + "买东西");
}); event.fire("drink", "我");
// 我喝水
event.fire("drink", "我");
// 我喝水
event.fire("eat", "其它人");
// 其它人吃东西
event.fire("eat", "其它人");
// 其它人吃东西
event.fire("buy", "其它人");
//其它人买东西
event.fire("buy", "其它人");
//这里不会再次触发buy事件,因为once只能触发一次 event.off("eat") //移除eat事件
event.fire("eat", "其它人");
//这里不会触发eat事件,因为已经移除了

https://repl.it/@xgqfrms/Event-Bus



最新文章

  1. ODAC (odp.net) 从开发到部署
  2. ConterReplaceBehavior.class.php模板内容替换,如__PUBLIC__
  3. XML CDATA节点
  4. linux死锁检测的一种思路【转】
  5. YTU 2972: C语言习题5.24--文件操作1
  6. Tomcat的安装(一)
  7. RESTful API 设计最佳实践(转)
  8. [ Web Service ] [ SOAP ] [ JSON ] [ XML ] 格式轉換
  9. C#测量程序运行时间及cpu使用时间
  10. ceph入门学习链接
  11. 关于DCL的使用
  12. AGC010 - C: Cleaning
  13. 如何保证MongoDB的安全性?
  14. c#操作SQL Server入门总结
  15. BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
  16. OOA/OOD/OOP
  17. 实现mybash
  18. Codeforces Round #499 (Div. 2) C. Fly(数学+思维模拟)
  19. c# 以换行(\r\n)拆分字符串
  20. fastjson的常用方法

热门文章

  1. gitignore 不起作用的解决办法 不再跟踪 让.gitignore生效,跟踪希望被跟踪的文件
  2. 从零搭建一个IdentityServer——初识OpenIDConnect
  3. 大型面试现场:一条update sql执行都经历什么?
  4. Nginx 指定域名(或子域名)和网站绑定
  5. jackson学习之七:常用Field注解
  6. Codeforces Round #613 (Div. 2) B. Just Eat It!(前缀和)
  7. Codeforces Round #633 (Div. 2)
  8. Codeforces 1355 E. Restorer Distance(三分)
  9. AtCoder Beginner Contest 163
  10. 【uva 1617】Laptop(算法效率--贪心,2种理解)