简介
Mojo::EventEmitter - Event emitter base class
Mojo::EventEmitter
是 Mojo
中事件系统的基类。
下面是一个简单的例子
package Cat;
use Mojo::Base 'Mojo::EventEmitter';
# 出拳时 触发 吼叫 事件,也就是出拳的同时要吼叫
sub poke {
my $self = shift;
$self->emit(roar => 3);
}
package main;
my $tiger = Cat->new;
## 注册一个事件
$tiger->on(roar => sub {
my ($tiger, $times) = @_;
say 'RAWR!' for 1 .. $times;
});
## 出拳
$tiger->poke;
可以触发的事件
Mojo::EventEmitter
可以触发以下事件
error
$e->on(error => sub {
my ($e, $err) = @_;
...
});
这个事件不会被类直接触发,如果没有注册这个事件的监听函数的话,当这个程序的代码发生错误时会直接退出程序。
方法
Mojo::EventEmitter
继承了 Mojo::Base
中所有的方法 并 实现了以下方法
catch
cache 方法的实现代码如下:
sub catch { $_[0]->on(error => $_[1]) and return $_[0] }
可以看出 在内容它是调用了 on
方法的。
下面的两行代码是等价的:.
$e->cache(sub {...});
## 等价于
$e->on(error => sub {...});
emit
触发事件
$e = $e->emit('foo');
$e = $e->emit('foo', 123);
第一个参数是“事件名”,第二个及以后的参数,会作为事件监听器函数的参数。
has_subscribers
my $bool = $e->has_subscribers('foo');
检查是否注册过某事件,参数为事件名,如果该对象已经注册过对应的事件则返回true,否则返回 false。
on
my $cb = $e->on(foo => sub {...});
注册一个事件
$e->on(foo => sub {
my ($e, @args) = @_;
...
});
这个方法接收两个参数,第一个参数是“事件名”,第二个参数是事件被触发时才执行的 事件监听器函数。
事件监听器函数
事件监听器函数接收的第一个参数是触发事件的对象,第二个及以后的参数(如果有的话),是触发该事件时调用 emit 函数的第二及以后的参数。
once
my $cb = $e->once(foo => sub {...});
注册一个只被触发一次的事件监听器函数。
处理方式是,在 once
函数内部对原事件监听器函数 s 进行包装,得到一个包装后的事件监听器函数 d,在这个d 函数被调用时它会把自己从事件栈中取消注册,并调用 s。如此就实现了 s 函数只被触发调用一次的业务逻辑。
在 once
中 事件监听器函数接收的参数与 on
中相同。
实现代码如下:
sub once {
my ($self, $name, $cb) = @_;
weaken $self;
my $wrapper;
$wrapper = sub {
$self->unsubscribe($name => $wrapper);
$cb->(@_);
};
$self->on($name => $wrapper);
weaken $wrapper;
return $wrapper;
}
subscribers
检查某事件都有哪些监听函数。
my $subscribers = $e->subscribers('foo');
接收一个事件名作为参数,返回一个事件监听器函数的数组。如果该事件没有被注册,则返回一个空数组。
# 删除 foo 事件的最后一个监听器
$e->unsubscribe(foo => $e->subscribers('foo')->[-1]);
# 把 foo 事件的监听器函数反转顺序
@{$e->subscribers('foo')} = reverse @{$e->subscribers('foo')};
unsubscribe
删除事件监听器函数。
$e = $e->unsubscribe('foo');
$e = $e->unsubscribe(foo => $cb);
接收两个函数,第一个参数为事件名,第二个参数是事件监听器函数,其中第一个参数是必须的。
如果只传了一个参数(事件名),则把对应事件的所有监听器函数删除。
如果传了两个参数,则把对应事件的对应监听器函数删除。如果没有找到对应的事件或事件监听器函数,则什么也不做。
DEBUGGING
你可以设置 环境变量 MOJO_EVENTEMITTER_DEBUG
的值为真,这样你就可以在 标准错误流 中得到一些有用的错误或警告信息,这些信息可以帮助你排序错误,调试程序。
MOJO_EVENTEMITTER_DEBUG=1
网友评论