如何在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
相关产品推荐
相关产品推荐

