You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
importmittOncefrom"./once";typeEvents={foo?: string;};constemitter=mittOnce<Events>();functionA(){console.log("A");}functionB(){console.log("B");}emitter.on("foo",A);emitter.once("foo",B);emitter.emit("foo");// A Bemitter.emit("foo");// A
async
比如我要 emit 事件,我还想知道触发的事件是否全部执行完毕了。这里我扩展了两个 api 分别是 串行(emitSerial) 和并行(emitParallel)。这两个功能都是对原始的函数使用 Promise 去执行。
importmittAsyncfrom"./async";typeEvents={foo?: string;};constemitter=mittAsync<Events>();asyncfunctionA(){awaitnewPromise((reslove)=>{setTimeout(()=>{console.log("A");reslove("A");},2000);});}functionB(){returnnewPromise((reslove)=>{setTimeout(()=>{console.log("B");reslove("B");},1000);});}functionC(){console.log("C");}emitter.on("foo",A);emitter.on("foo",B);emitter.on("foo",C);// 原始 C D B Aemitter.emit("foo");console.log("D");// 串行 A B C D(async()=>{awaitemitter.emitSerial("foo");console.log("D");})();// 并行 C B A D(async()=>{emitter.emitParallel("foo").then(()=>{console.log("D");});})();
总结
高级类型平常用业务的不多,一般也就类库中应用的多,也学也忘了刚好回顾下。
扩展功能中用到了 compose 刚好是对前几期源码的应用。
The text was updated successfully, but these errors were encountered:
前言
这是一个很小型的发布订阅库 https://github.com/developit/mitt。
是的它很小只有
200b
,既然小当然功能简洁。作者为了压缩后文件大小绝对不能大于200b
所以社区提的功能请求并没有解决,这次除了看源码外,再尝试解决一下未实现的功能请求 Async extension for mitt。环境
依赖包内置了
ts-node
如果想直接运行ts
的文件了使用npx ts-node xxx.ts
。源码
类型声明
从类型声明就可以大概看出存储的什么结构,有一个总集合
Map
,Map
的一个Key
对应多个回调函数。功能实现
on
on
的作用就是以type
为键和分类把回调收集起来。off
off
的作用就是根据type
找到对应的函数从集合中删除,如果没传入回调则全部删除。关于
handlers.indexOf(handler) >>> 0
,这有一遍文章 https://segmentfault.com/a/1190000014613703。emit
emit
的作用就是以type
获取到对应的集合,依次运行对应的函数。关于为什么要用一次
slice
developit/mitt#109。功能扩展
在翻看
Issues
的时候发现有两个功能讨论的比较多(也有给出方案但感觉不完善),有用也是有用就是作者不想大小不想超过预期。所以啊作者不实现的我们就得根据自己的需要去改。所以我对这两个功能尝试在不改动源码的情况下去解决,现在用不到以后不一定了。once
once
是只触发一次。所以实现就是触发一次之后立刻解除监听。实现方式为对原始的功能进行包装。测试示例和结果如下。
async
比如我要
emit
事件,我还想知道触发的事件是否全部执行完毕了。这里我扩展了两个api
分别是 串行(emitSerial
) 和并行(emitParallel
)。这两个功能都是对原始的函数使用Promise
去执行。测试示例和结果如下。
总结
高级类型平常用业务的不多,一般也就类库中应用的多,也学也忘了刚好回顾下。
扩展功能中用到了
compose
刚好是对前几期源码的应用。The text was updated successfully, but these errors were encountered: