Package eventbus is the little and lightweight eventbus with async compatibility for GoLang.
func calculator(a int, b int) {
fmt.Printf("%d\n", a + b)
}
func main() {
bus := eventbus.New();
bus.Subscribe("main:calculator", calculator);
bus.Publish("main:calculator", 20, 40);
bus.Unsubscribe("main:calculator", calculator);
}
- New()
- Subscribe()
- SubscribeOnce()
- HasCallback()
- Unsubscribe()
- Publish()
- WaitAsync()
New returns new eventbus with empty handlers.
bus := eventbus.New();
Subscribe to a topic. Returns error if fn
is not a function.
func Handler() { ... }
...
bus.Subscribe("topic:handler", Handler)
Subscribe to a topic once. Handler will be removed after executing. Returns error if fn
is not a function.
func HelloWorld() { ... }
...
bus.Subscribe("topic:handler", HelloWorld, eventbus.WithOnce())
Remove callback defined for a topic. Returns error if there are no callbacks subscribed to the topic.
bus.Unsubscribe("topic:handler", HelloWord);
Returns true if exists any callback subscribed to the topic.
Publish executes callback defined for a topic. Any additional argument will be transferred to the callback.
func Handler(str string) { ... }
...
bus.Subscribe("topic:handler", Handler)
...
bus.Publish("topic:handler", "Hello, World!");
Subscribe to a topic with an asynchronous callback. Returns error if fn
is not a function.
func slowCalculator(a, b int) {
time.Sleep(3 * time.Second)
fmt.Printf("%d\n", a + b)
}
bus := eventbus.New()
bus.Subscribe("main:slow_calculator", slowCalculator, eventbus.WithAsync(), eventbus.WithTransactional())
bus.Publish("main:slow_calculator", 20, 60)
fmt.Println("start: do some stuff while waiting for a result")
fmt.Println("end: do some stuff while waiting for a result")
bus.WaitAsync() // wait for all async callbacks to complete
fmt.Println("do some stuff after waiting for result")
Transactional determines whether subsequent callbacks for a topic are run serially (true) or concurrently(false)
SubscribeOnceAsync works like SubscribeOnce except the callback to executed asynchronously
WaitAsync waits for all async callbacks to complete.
If you do have a contribution for the package feel free to put up a Pull Request or open Issue.