1 Star 3 Fork 0

gm/mingo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
bus.go 2.06 KB
一键复制 编辑 原始数据 按行查看 历史
gm 提交于 2025-06-14 23:50 +08:00 . 导出参数
package mingo
type BusCallBack[T any] func(ctx T, event string, data any) error
type BusEventResult struct {
Bsn string
Res error
}
type BusOnResultFunc[T any] func(ctx T, event string, data any, allSuccess bool, details []BusEventResult)
type eventItem[T any] struct {
bsn string
cb BusCallBack[T]
}
// 事件总线
// T:上下文泛型
type Bus[T any] struct {
cbs map[string][]eventItem[T]
onResult BusOnResultFunc[T]
}
// event:监听的事件名称
// bsn:业务名称 用于做结果稽查,bsn 确定后,不应更改,以便后续重用
// cb:回调函数
func (t *Bus[T]) On(event string, bsn string, cb BusCallBack[T]) {
item, exist := t.cbs[event]
if exist {
t.cbs[event] = append(item, eventItem[T]{bsn, cb})
} else {
t.cbs[event] = []eventItem[T]{{bsn, cb}}
}
}
// event:监听的事件名称
// data:事件数据
// bsns:仅重试的事件
// 重试情况下,结果回调仍会被触发
func (t *Bus[T]) Retry(ctx T, event string, data any, bsns []string) {
proc, exist := t.cbs[event]
if exist {
res := []BusEventResult{}
allSuccess := true
for i := range len(proc) {
if Includes(bsns, func(item *string) bool { return *item == proc[i].bsn }) {
err := proc[i].cb(ctx, event, data)
res = append(res, BusEventResult{
Bsn: proc[i].bsn,
Res: err,
})
if err != nil {
allSuccess = false
}
}
}
if t.onResult != nil {
t.onResult(ctx, event, data, allSuccess, res)
}
}
}
// 触发事件
// event:事件名称
// data:事件参数,推荐使用指针
func (t *Bus[T]) Emit(ctx T, event string, data any) {
proc, exist := t.cbs[event]
if exist {
res := make([]BusEventResult, len(proc))
allSuccess := true
for i := range len(proc) {
err := proc[i].cb(ctx, event, data)
res[i] = BusEventResult{
Bsn: proc[i].bsn,
Res: err,
}
if err != nil {
allSuccess = false
}
}
if t.onResult != nil {
t.onResult(ctx, event, data, allSuccess, res)
}
}
}
func NewBus[T any](onResult BusOnResultFunc[T]) *Bus[T] {
return &Bus[T]{cbs: make(map[string][]eventItem[T]), onResult: onResult}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/liangguoming/mingo.git
git@gitee.com:liangguoming/mingo.git
liangguoming
mingo
mingo
v0.13.2

搜索帮助