add code
This commit is contained in:
parent
82dcecf1a1
commit
95a538dbfe
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
// 使用 IntelliSense 了解相关属性。
|
||||||
|
// 悬停以查看现有属性的描述。
|
||||||
|
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Launch Package",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "auto",
|
||||||
|
"program": "${fileDirname}"
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
emitter "git.pyer.club/kingecg/goemitter"
|
||||||
|
)
|
||||||
|
|
||||||
|
type St struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *St) Print(data ...interface{}) {
|
||||||
|
fmt.Println(s.Name)
|
||||||
|
fmt.Println(data...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
s := &St{Name: "testeer"}
|
||||||
|
em := emitter.NewEmitter()
|
||||||
|
em.On("test", func(data ...interface{}) {
|
||||||
|
fmt.Println(data...)
|
||||||
|
})
|
||||||
|
|
||||||
|
em.On("test", s.Print)
|
||||||
|
em.Once("test", func(data ...interface{}) {
|
||||||
|
s := fmt.Sprint(data...)
|
||||||
|
fmt.Println(interface{}("Once"), s)
|
||||||
|
})
|
||||||
|
em.EmitSync("test", "hello", "world")
|
||||||
|
em.Emit("test", "hello", "world2")
|
||||||
|
select {}
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
// Package goemitter
|
||||||
|
package goemitter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type EventEmitter struct {
|
||||||
|
callbacks map[string][]func(args ...interface{})
|
||||||
|
onceCallbacks map[string][]func(args ...interface{})
|
||||||
|
lock sync.Mutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EventEmitter) On(event string, callback func(args ...interface{})) {
|
||||||
|
e.lock.Lock()
|
||||||
|
defer e.lock.Unlock()
|
||||||
|
|
||||||
|
if _, ok := e.callbacks[event]; !ok {
|
||||||
|
e.callbacks[event] = []func(args ...interface{}){callback}
|
||||||
|
} else {
|
||||||
|
e.callbacks[event] = append(e.callbacks[event], callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EventEmitter) Once(event string, callback func(args ...interface{})) {
|
||||||
|
e.lock.Lock()
|
||||||
|
defer e.lock.Unlock()
|
||||||
|
|
||||||
|
if _, ok := e.onceCallbacks[event]; !ok {
|
||||||
|
e.onceCallbacks[event] = append(e.onceCallbacks[event], callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EventEmitter) Emit(event string, data ...interface{}) {
|
||||||
|
e.lock.Lock()
|
||||||
|
defer e.lock.Unlock()
|
||||||
|
|
||||||
|
if callbacks, ok := e.callbacks[event]; ok {
|
||||||
|
for _, callback := range callbacks {
|
||||||
|
go callback(data...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if onceCallbacks, ok := e.onceCallbacks[event]; ok {
|
||||||
|
for _, callback := range onceCallbacks {
|
||||||
|
go callback(data...)
|
||||||
|
|
||||||
|
}
|
||||||
|
e.onceCallbacks[event] = []func(args ...interface{}){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *EventEmitter) EmitSync(event string, data ...interface{}) {
|
||||||
|
e.lock.Lock()
|
||||||
|
defer e.lock.Unlock()
|
||||||
|
|
||||||
|
if callbacks, ok := e.callbacks[event]; ok {
|
||||||
|
for _, callback := range callbacks {
|
||||||
|
callback(data...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if onceCallbacks, ok := e.onceCallbacks[event]; ok {
|
||||||
|
for _, callback := range onceCallbacks {
|
||||||
|
callback(data...)
|
||||||
|
|
||||||
|
}
|
||||||
|
e.onceCallbacks[event] = []func(args ...interface{}){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEmitter() *EventEmitter {
|
||||||
|
ret := &EventEmitter{}
|
||||||
|
ret.callbacks = make(map[string][]func(args ...interface{}))
|
||||||
|
ret.onceCallbacks = make(map[string][]func(args ...interface{}))
|
||||||
|
return ret
|
||||||
|
}
|
Loading…
Reference in New Issue