package main
import (
"context"
"fmt"
"time"
"github.com/sagoo-cloud/nexframe/signals"
)
func main() {
// 创建异步信号
numberSignal := signals.New[int]()
// 添加监听器
numberSignal.AddListener(func(ctx context.Context, n int) {
fmt.Printf("监听器 1 收到: %d\n", n)
})
numberSignal.AddListener(func(ctx context.Context, n int) {
fmt.Printf("监听器 2 收到: %d\n", n*2)
}, "doubler")
// 添加可能会 panic 的监听器
numberSignal.AddListener(func(ctx context.Context, n int) {
if n == 0 {
panic("除数不能为 0")
}
fmt.Printf("监听器 3 收到: %d\n", 100/n)
})
// 发射信号
ctx := context.Background()
fmt.Println("发射信号 5")
err := numberSignal.Emit(ctx, 5)
if err != nil {
fmt.Println("错误:", err)
}
fmt.Println("发射信号 0")
err = numberSignal.Emit(ctx, 0)
if err != nil {
fmt.Println("错误:", err)
}
// 使用超时上下文
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
defer cancel()
numberSignal.AddListener(func(ctx context.Context, n int) {
time.Sleep(200 * time.Millisecond)
fmt.Println("这条消息不会被打印,因为已经超时")
}, "slow")
fmt.Println("发射信号 10 (带超时)")
err = numberSignal.Emit(ctx, 10)
if err != nil {
fmt.Println("错误:", err)
}
// 移除监听器
numberSignal.RemoveListener("doubler")
fmt.Println("发射信号 7 (移除了一个监听器)")
err = numberSignal.Emit(context.Background(), 7)
if err != nil {
fmt.Println("错误:", err)
}
// 重置信号
numberSignal.Reset()
fmt.Printf("重置后的监听器数量: %d\n", numberSignal.Len())
}