代码拉取完成,页面将自动刷新
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}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。