Skip to content

EventBus

EventbBus是一个事件总线,用于在应用程序中处理事件。

源码:

用法:

go
import (
    "github.com/duke-git/lancet/v2/eventbus"
)

目录

文档

NewEventBus

创建EventBus实例。

函数签名:

go
func NewEventBus[T any]() *EventBus[T]

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    receivedData := 0
    listener := func(eventData int) {
        receivedData = eventData
    }

    eb.Subscribe("event1", listener, false, 0, nil)
    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})

    fmt.Println(receivedData)

    // Output:
    // 1
}

Subscribe

订阅具有特定事件主题和监听函数的事件。支持异步,事件优先级,事件过滤器。

函数签名:

go
func (eb *EventBus[T]) Subscribe(topic string, listener func(eventData T), async bool, priority int, filter func(eventData T) bool)

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    receivedData := 0
    listener := func(eventData int) {
        receivedData = eventData
    }

    filter := func(eventData int) bool {
        return eventData == 1
    }

    eb.Subscribe("event1", listener, false, 0, filter)

    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})
    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 2})

    fmt.Println(receivedData)

    // Output:
    // 1
}

Unsubscribe

取消订阅具有特定事件主题的事件。

函数签名:

go
func (eb *EventBus[T]) Unsubscribe(topic string, listener func(eventData T))

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    receivedData := 0
    listener := func(eventData int) {
        receivedData = eventData
    }

    eb.Subscribe("event1", listener, false, 0, nil)
    eb.Unsubscribe("event1", listener)

    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})

    fmt.Println(receivedData)

    // Output:
    // 0
}

Publish

发布一个带有特定事件主题和数据负载的事件。

函数签名:

go
func (eb *EventBus[T]) Publish(event eventbus.Event[T])

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    eb.Subscribe("event1", func(eventData int) {
        fmt.Println(eventData)
    }, false, 0, nil)

    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})

    // Output:
    // 1
}

ClearListeners

清空所有事件监听器。

函数签名:

go
func (eb *EventBus[T]) ClearListeners()

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    receivedData := 0
    listener := func(eventData int) {
        receivedData = eventData
    }

    eb.Subscribe("event1", listener, false, 0, nil)
    eb.Subscribe("event2", listener, false, 0, nil)

    eb.ClearListeners()

    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})
    eb.Publish(eventbus.Event[int]{Topic: "event2", Payload: 2})

    fmt.Println(receivedData)

    // Output:
    // 0
}

ClearListenersByTopic

清空特定事件监听器。

函数签名:

go
func (eb *EventBus[T]) ClearListenersByTopic(topic string)

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    receivedData := 0
    listener := func(eventData int) {
        receivedData = eventData
    }

    eb.Subscribe("event1", listener, false, 0, nil)
    eb.Subscribe("event2", listener, false, 0, nil)
    
    eb.ClearListenersByTopic("event1")

    eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})
    eb.Publish(eventbus.Event[int]{Topic: "event2", Payload: 2})

    fmt.Println(receivedData)

    // Output:
    // 2
}

GetListenersCount

获取特定事件的监听器数量。

函数签名:

go
func (eb *EventBus[T]) GetListenersCount(topic string) int

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    eb.Subscribe("event1", func(eventData int) {}, false, 0, nil)
    eb.Subscribe("event2", func(eventData int) {}, false, 0, nil)

    count := eb.GetListenersCount("event1")

    fmt.Println(count)

    // Output:
    // 1
}

GetAllListenersCount

获取所有事件的监听器数量。

函数签名:

go
func (eb *EventBus[T]) GetAllListenersCount() int

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    eb.Subscribe("event1", func(eventData int) {}, false, 0, nil)
    eb.Subscribe("event2", func(eventData int) {}, false, 0, nil)

    count := eb.GetAllListenersCount()

    fmt.Println(count)

    // Output:
    // 2
}

GetEvents

获取所有事件的topic。

函数签名:

go
func (eb *EventBus[T]) GetEvents() []string

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    eb.Subscribe("event1", func(eventData int) {}, false, 0, nil)
    eb.Subscribe("event2", func(eventData int) {}, false, 0, nil)

    events := eb.GetEvents()

    for _, event := range events {
        fmt.Println(event)
    }

    // Output:
    // event2
    // event1
}

SetErrorHandler

设置事件的错误处理函数。

函数签名:

go
func (eb *EventBus[T]) SetErrorHandler(handler func(err error))

示例:运行

go
import (
    "fmt"
    "github.com/duke-git/lancet/v2/eventbus"
)

func main() {
    eb := eventbus.NewEventBus[int]()

    eb.SetErrorHandler(func(err error) {
		fmt.Println(err)
	})

	eb.Subscribe("event1", func(eventData int) {
		panic("error")
	}, false, 0, nil)

	eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1})

	// Output:
	// error
}