emitter-master
为公司编写的离线发送订阅,剥离出来形成一个很小的库,暂时没时间大量测试,反正有问题会修,因为我司用的就是这个。
基本使用
支持离线队列的事件发射器
import { Emitter } from "emitter-master"
Emitter.sender("A<->B", 123)
const ret = await Emitter.receiver("A<->B")
Emitter.receiver("A<->B",function(val){
console.log(val)
})
Emitter.clear("A<->B")
sender有一个别名叫做trigger
receiver有一个别名叫做listener
还有一个once表示只监听一次
根据你自己的场景来决定使用那个名称可以带来更好的语义。
使用场景:
- 两个距离很远的组件直接通信,支持A先发数据,然后A被销毁,B创建的时候可以接收到A销毁前的数据
- 一个组件需要根据特定来源来执行特定操作,如果不是特定来源就跳过特定操作,由于在receiver没有回调的时候会立即返回不会阻塞,这个场景非常适合用这个库解决
- 接入ws数据,这个普通的发布订阅就够了
vue和react中的推荐规范
首先要明确的是该库与框架无关,但是现在前端很多都是用vue和react来构建网站,所以这里给出我的推荐使用方式
**建议一:**定义存储事件名称的event_name.ts 文件,该文件只定义事件名称和事件名称的注释,注意每个事件名称都要有注释,否则这样做将毫无意义,事件名称以 A->B
的形式表示A组件会项B组件发送数据,以A<->B
的形式表示A和B会互相发送数据,下面是示例
const CompA_CompB = "CompA->CompB"
export {
CompA_CompB
}
建议二: 对于非组件与组件的通信依然要明确指定来源和目标,例如我在Axios的封装中向组件CompA发,那么可以命名为:Axios->CompA
**建议三:**记得在组件卸载之前清除事件
示例
import {Emitter} from "emitter-master"
Emitter.sender( "a-b" , true);
( async function ()
{
const ret = await Emitter.receiver( "a-b" );
console.log("ret")
console.log( ret );
} )();