You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Raku的Supply中注册不同类型的事件?

Raku中实现类似Node.js EventEmitter的事件分类功能

你说的没错,Raku里的Supplies确实是处理异步事件/数据流的核心组件,和Node.js的EventEmitter定位相近。要实现按事件名称区分订阅和触发的功能,完全可以做到,而且用subscribe(或其语法糖tap)和send就是标准的实现方式。

模拟EventEmitter的Raku实现

我们可以自定义一个类来复刻Node.js EventEmitter的核心行为:

class EventEmitter {
    # 存储不同事件对应的Supplier实例
    has %!supplies;

    # 注册事件回调
    method on(Str $event, &callback) {
        # 若事件不存在则创建对应的Supplier
        %!supplies{$event} //= Supplier.new;
        # 绑定回调(tap是subscribe的常用语法糖)
        %!supplies{$event}.tap(&callback);
    }

    # 触发指定事件并传递参数
    method emit(Str $event, *@args) {
        %!supplies{$event}.send(@args) if %!supplies{$event}:exists;
    }
}

# 使用示例
my $emitter = EventEmitter.new;

$emitter.on('start', { say 'started' });
$emitter.on('end', { say "ended $_[0]" });

$emitter.emit('start');
$emitter.emit('end', 23);

关于subscribe和send的说明

你在jnthn文章里看到的subscribe和send是完全正确的实现方式:

  • Supplier的send方法负责向订阅者推送事件数据;
  • tap是Raku中更常用的订阅语法,本质和底层的subscribe方法功能一致,都是绑定回调函数来响应事件。

内容的提问来源于stack exchange,提问作者uzluisf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:22:42