希望"事件"这个词在乐天不会用词不当.据我所知,Supplies是其他编程语言(如NodeJS)中"事件"的Raku类似功能.在NodeJS中,您可以注册不同的事件,可以使用emit的第一个参数专门针对这些事件.在乐库可以做到这一点吗?

const EventEmitter = require('events');
const eventEmitter = new EventEmitter();

eventEmitter.on('start', () => {
  console.log('started');
});

eventEmitter.on('end', (value) => {
  console.log(`ended ${value}` );
});

eventEmitter.emit('start');
eventEmitter.emit('end', 23);

我正在阅读A nice supplies: syntactic relief for working with asynchronous data(我还没有读完),我看到jnthn实现了subscribesend的订阅机制,所以我想知道这是不是应该这样做.

推荐答案

Supply是一种适合事件分发的机制,但与EventEmitter不同的是,它没有直接的命名事件机制--部分原因是Raku已经有了大量的过滤和调度方法,这些方法可以重复使用.

最常见的方法是使用键入的消息:

class Start { }

class End {
    has $.value
}

假设Supplier分,我们可以排放以下物质:

my $supplier = Supplier.new;
$supplier.emit(Start); # Don't need an instance if there's no data
$supplier.emit(End.new(value => 42));

接收端为Supply:

my $supply = $supplier.Supply;

通常,执行emits 的事务将Supplier保留为私有,并返回Supply,这只允许接收.

在接收端,我们有多种方法来处理事件.例如,我们可以最直接地将您的示例翻译为:

$supply.grep(Start).tap: {
    say "started";
}

$supply.grep(End).tap: {
    say "ended {.value}";
}

如果使用 struct 化的supplyreact数据块,则为:

react {
    whenever $supply.grep(Start) {
        say "started";
    }
    whenever $supply.grep(End) {
        say "ended {.value}";
    }
}

或者,您可能更喜欢使用whenMatch struct :

$supply.tap: {
    when Start { say "started"; }
    when End { say "ended {.value}"; }
}

这在 struct 化方法中也是类似的工作方式:

react {
    whenever $supply {
        when Start { say "started"; }
        when End { say "ended {.value}"; }
    }
}

或者,您可以编写多个调度 routine 并订阅这些 routine :

multi process(Start) {
    say "started"
}
multi process(End (:$value)) { # Can destructure the message in the signature
    say "ended $value"
}
$supply.tap(&process);

除了接收端方法的灵活性之外,另一个优点是类名中的拼写错误将在编译时被检测到,而字符串中的拼写错误--至少如果您不是在TypeScrip或类似的语言中--很可能要到很晚才会被注意到.

Node.js相关问答推荐

node 无法验证第一个证书

为高流量网站优化Node.js实时通知服务

GitLab SAST中的Nodejcan未找到匹配项

如何在MongoDB中更新嵌套数组

一个函数中的两个依赖的NodeJS数据库操作.如果第二个失败了怎么办?

使用 axios 和 Cheerio (Node js) 抓取 google 搜索

MongoDB:通过匹配输入字符串或输入字符串中的单个单词进行搜索

我正在try 在公共目录中使用 Express.js 项目部署 Angular 静态构建

如何获取需要加载cheerio的网站部分数据?

使用 node/express/Multer,您如何首先判断参数?

在新创建的 Angular 工作区上运行 ng lint 时出错

Cassandra node.js 驱动程序有替代品吗?

如何正确使用 package.json 中的关键字属性?

如何运行用 TypeScript 编写的 Mocha 测试?

如何让should.be.false语法通过 jslint?

为什么 Node 控制台不显示功能代码?

PhoneGap/Cordova Android 开发

Node应用程序中相同npm包的两个版本

Mongoose:模式与模型?

nodemon + express,监听端口=?