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
}
这个函数的如下逻辑
在并发下会有数据互相覆盖的情况