gookit / event

📢 Lightweight event manager and dispatcher implements by Go. Go实现的轻量级的事件管理、调度程序库, 支持设置监听器的优先级, 支持使用通配符来进行一组事件的监听
https://pgk.go.dev/github.com/gookit/event
MIT License
501 stars 59 forks source link

见图片,并发下数据会有问题 #48

Closed pigfu closed 1 year ago

pigfu commented 1 year ago
func (em *Manager) Fire(name string, params M) (err error, e Event) {
    name = goodName(name)

    // NOTICE: must check the '*' global listeners
    if false == em.HasListeners(name) && false == em.HasListeners(Wildcard) {
        // has group listeners. "app.*" "app.db.*"
        // eg: "app.db.run" will trigger listeners on the "app.db.*"
        pos := strings.LastIndexByte(name, '.')
        if pos < 0 || pos == len(name)-1 {
            return // not found listeners.
        }

        groupName := name[:pos+1] + Wildcard // "app.db.*"
        if false == em.HasListeners(groupName) {
            return // not found listeners.
        }
    }

    // call listeners use defined Event
    if e, ok := em.events[name]; ok {
        if params != nil {
            e.SetData(params)
        }

        err = em.FireEvent(e)
        return err, e
    }

    // create a basic event instance
    e = em.newBasicEvent(name, params)
    // call listeners handle event
    err = em.FireEvent(e)
    return
}

这个函数的如下逻辑


if e, ok := em.events[name]; ok {
        if params != nil {
            e.SetData(params)
        }

        err = em.FireEvent(e)
        return err, e
    }

在并发下会有数据互相覆盖的情况

inhere commented 1 year ago

已经调整逻辑,更新到 v1.1.0 试试呢