In Supply§

请参阅方法 tap的上下文中的主要文档 in context

method tap(Supply:D: &emit = -> $ { },
        :&done = -> {},
        :&quit = -> $ex { $ex.throw },
        :&tap = -> $ {} )

创建一个新 tap(某种订阅),除了所有现有的 tap。第一个位置参数是一段代码,当通过 emit 调用获得新值时将调用该代码。

&done 回调可以在多种情况下调用:如果正在 tap 一个供应块,则在到达 done 例程时;如果正在 tap 一个供应块,则当供应块到达末尾时,它将自动触发;如果对父级 Supplier 调用 done 方法(在供应块的情况下,如果有多个由 whenever 引用的 Supplier,则必须对它们全部调用 done 方法才能触发 tap 的 &done 回调,因为块将到达其末尾)。

如果 tap 位于以错误退出的供应块上,则调用 &quit 回调。如果对父级 Supplier 调用 quit 方法,也会调用它(在供应块的情况下,任何一个 Supplier 以未捕获的异常退出都会调用 &quit 回调,因为块将以错误退出)。错误作为参数传递给回调。

一旦创建 Tap 对象,就会调用 &tap 回调,该对象作为参数传递给回调。该回调在 emit/done/quit 之前调用,提供了一种获取 Tap 对象的可靠方法。此方法有用的一个情况是当 Supply 开始同步发出值时,因为对 .tap 的调用在发出完毕之前不会返回 Tap 对象,防止在需要时停止它。

方法 tap 返回类型为 Tap 的对象,您可以在该对象上调用 close 方法来取消订阅。

my $s = Supply.from-list(0 .. 5);
my $t = $s.tap(-> $v { say $v }done => { say "no more ticks" });

生成

0
1
2
3
4
5
no more ticks