Mojo::EventEmitter

简介

Mojo::EventEmitter - Event emitter base class

Mojo::EventEmitterMojo 中事件系统的基类。

下面是一个简单的例子

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

戛然而止

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 11,542评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,200评论 19 139
  • 内容来自《Node.js开发指南》 核心模块是 Node.js 的心脏,它由一些精简而高效的库组成,为 Node....
    angelwgh阅读 4,423评论 0 1
  • 从大年三十开始,始终保持着蓝天白云,温暖如春的天气,一直持续到大年初三,才开始变了天气,乌云堆满天穹,细雨洒洒的落...
    风儿轻轻阅读 3,362评论 4 1
  • 电子行业销售模板一般是三个板块组成:客户群基数+、转化率和客单量。 那么电子行业销售模板该如何理解呢?举例说明:假...
    勇往直前A2016阅读 4,153评论 0 1

友情链接更多精彩内容