mirror of
https://github.com/documize/community.git
synced 2025-07-25 16:19:46 +02:00
163 lines
4.7 KiB
Markdown
163 lines
4.7 KiB
Markdown
|
EventBus
|
||
|
======
|
||
|
|
||
|
[](https://godoc.org/github.com/asaskevich/EventBus) [](https://coveralls.io/r/asaskevich/EventBus?branch=master) [](https://travis-ci.org/asaskevich/EventBus)
|
||
|
|
||
|
Package EventBus is the little and lightweight eventbus with async compatibility for GoLang.
|
||
|
|
||
|
#### Installation
|
||
|
Make sure that Go is installed on your computer.
|
||
|
Type the following command in your terminal:
|
||
|
|
||
|
go get github.com/asaskevich/EventBus
|
||
|
|
||
|
After it the package is ready to use.
|
||
|
|
||
|
#### Import package in your project
|
||
|
Add following line in your `*.go` file:
|
||
|
```go
|
||
|
import "github.com/asaskevich/EventBus"
|
||
|
```
|
||
|
If you unhappy to use long `EventBus`, you can do something like this:
|
||
|
```go
|
||
|
import (
|
||
|
evbus "github.com/asaskevich/EventBus"
|
||
|
)
|
||
|
```
|
||
|
|
||
|
#### Example
|
||
|
```go
|
||
|
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);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
#### Implemented methods
|
||
|
* **New()**
|
||
|
* **Subscribe()**
|
||
|
* **SubscribeOnce()**
|
||
|
* **HasCallback()**
|
||
|
* **Unsubscribe()**
|
||
|
* **Publish()**
|
||
|
* **SubscribeAsync()**
|
||
|
* **SubscribeOnceAsync()**
|
||
|
* **WaitAsync()**
|
||
|
|
||
|
#### New()
|
||
|
New returns new EventBus with empty handlers.
|
||
|
```go
|
||
|
bus := EventBus.New();
|
||
|
```
|
||
|
|
||
|
#### Subscribe(topic string, fn interface{}) error
|
||
|
Subscribe to a topic. Returns error if `fn` is not a function.
|
||
|
```go
|
||
|
func Handler() { ... }
|
||
|
...
|
||
|
bus.Subscribe("topic:handler", Handler)
|
||
|
```
|
||
|
|
||
|
#### SubscribeOnce(topic string, fn interface{}) error
|
||
|
Subscribe to a topic once. Handler will be removed after executing. Returns error if `fn` is not a function.
|
||
|
```go
|
||
|
func HelloWorld() { ... }
|
||
|
...
|
||
|
bus.SubscribeOnce("topic:handler", HelloWorld)
|
||
|
```
|
||
|
|
||
|
#### Unsubscribe(topic string) error
|
||
|
Remove callback defined for a topic. Returns error if there are no callbacks subscribed to the topic.
|
||
|
```go
|
||
|
bus.Unsubscribe("topic:handler", HelloWord);
|
||
|
```
|
||
|
|
||
|
#### HasCallback(topic string) bool
|
||
|
Returns true if exists any callback subscribed to the topic.
|
||
|
|
||
|
#### Publish(topic string, args ...interface{})
|
||
|
Publish executes callback defined for a topic. Any addional argument will be tranfered to the callback.
|
||
|
```go
|
||
|
func Handler(str string) { ... }
|
||
|
...
|
||
|
bus.Subscribe("topic:handler", Handler)
|
||
|
...
|
||
|
bus.Publish("topic:handler", "Hello, World!");
|
||
|
```
|
||
|
|
||
|
#### SubscribeAsync(topic string, fn interface{}, transactional bool)
|
||
|
Subscribe to a topic with an asyncrhonous callback. Returns error if `fn` is not a function.
|
||
|
```go
|
||
|
func slowCalculator(a, b int) {
|
||
|
time.Sleep(3 * time.Second)
|
||
|
fmt.Printf("%d\n", a + b)
|
||
|
}
|
||
|
|
||
|
bus := EventBus.New()
|
||
|
bus.SubscribeAsync("main:slow_calculator", slowCalculator, false)
|
||
|
|
||
|
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(topic string, args ...interface{})
|
||
|
SubscribeOnceAsync works like SubscribeOnce except the callback to executed asynchronously
|
||
|
|
||
|
#### WaitAsync()
|
||
|
WaitAsync waits for all async callbacks to complete.
|
||
|
|
||
|
#### Cross Process Events
|
||
|
Works with two rpc services:
|
||
|
- a client service to listen to remotely published events from a server
|
||
|
- a server service to listen to client subscriptions
|
||
|
|
||
|
server.go
|
||
|
```go
|
||
|
func main() {
|
||
|
server := NewServer(":2010", "/_server_bus_", New())
|
||
|
server.Start()
|
||
|
// ...
|
||
|
server.EventBus().Publish("main:calculator", 4, 6)
|
||
|
// ...
|
||
|
server.Stop()
|
||
|
}
|
||
|
```
|
||
|
|
||
|
client.go
|
||
|
```go
|
||
|
func main() {
|
||
|
client := NewClient(":2015", "/_client_bus_", New())
|
||
|
client.Start()
|
||
|
client.Subscribe("main:calculator", calculator, ":2010", "/_server_bus_")
|
||
|
// ...
|
||
|
client.Stop()
|
||
|
}
|
||
|
```
|
||
|
|
||
|
#### Notes
|
||
|
Documentation is available here: [godoc.org](https://godoc.org/github.com/asaskevich/EventBus).
|
||
|
Full information about code coverage is also available here: [EventBus on gocover.io](http://gocover.io/github.com/asaskevich/EventBus).
|
||
|
|
||
|
#### Support
|
||
|
If you do have a contribution for the package feel free to put up a Pull Request or open Issue.
|
||
|
|
||
|
#### Special thanks to [contributors](https://github.com/asaskevich/EventBus/graphs/contributors)
|
||
|
* [Brian Downs](https://github.com/briandowns)
|
||
|
* [Dominik Schulz](https://github.com/gittex)
|
||
|
* [bennAH](https://github.com/bennAH)
|
||
|
* [John Noble] (https://github.com/gaxunil)
|
||
|
* [Evan Borgstrom] (https://github.com/borgstrom)
|