背景
在前端开发中,我们经常需要实现事件的发布与订阅,这时候我们可以选择使用 eventEmitter 来实现。但是如果我们需要在多个域名间共享事件,该怎么办呢?这时候就需要使用 npm 包 emitter-domain
来实现了。
安装
在项目中安装 emitter-domain
:
npm install emitter-domain --save
然后在代码中引入:
const EmitterDomain = require("emitter-domain");
使用
创建 EmitterDomain
使用 EmitterDomain
基础类来创建一个 emitterDomain
实例:
const emitterDomain = new EmitterDomain();
域名映射
使用 setDomainMap(domainMap)
方法设置域名映射,使不同域名的 emitter
可以被识别。
const domainMap = { "domain1.example.com": emitter1, "domain2.example.com": emitter2 }; emitterDomain.setDomainMap(domainMap);
发布事件
使用 emitterDomain.emit(domain, eventName, arg1, arg2, ...)
方法发布一个事件:
emitterDomain.emit("domain1.example.com", "my-event", "arg1", "arg2");
订阅事件
使用 emitterDomain.on(domain, eventName, listener)
方法订阅一个事件:
emitterDomain.on("domain1.example.com", "my-event", listenerFunction);
取消订阅
使用 emitterDomain.offAll(domain, eventName)
方法取消某个域名下的所有事件的订阅:
emitterDomain.offAll("domain1.example.com", "my-event");
示例
-- -------------------- ---- ------- ----- ------------- - -------------------------- -- ---- ------- -- ----- -------- - --- ---------- ----- -------- - --- ---------- -- ---- ----- --------- - - ---------------------- --------- ---------------------- -------- -- -- -- ------------- -- ----- ------------- - --- ---------------- -------------------------------------- -- --- ------------------- ----- ----------------------------------------- ----------- ------- -------- -- --- ------------------- ----- --------------------------------------- ----------- ------ ----- -- - ----------------- ------ -- -- ----- ----- --- -- --- ------------------- ----- ----------------------------------------- ---------------- ------- -------- -- --- ------------------- ------ ------------------- ------ --------------------------------------- ----------- ------ ----- -- - ----------------- ------ -- ------- ------------------- ----- ------------------- ---- -------- -- --- -- ----- ------------------- -- -------- ---- ------------------------------------------- ------------
总结
使用 emitter-domain
可以很方便地在不同域名下共享事件,同时也能够解决多个域名下相同事件名称的冲突问题。但是需要注意,不同域名下的 emitter 实例需要在对应的 domainMap
中进行映射,否则 emit
和 on
方法会无法识别 emitter 实例。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066e1ba563576b7b1ecc30