Mojo::EventEmitter

作者: JSON_NULL | 来源:发表于2017-01-22 15:59 被阅读31次

    简介

    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
    

    戛然而止

    相关文章

      网友评论

        本文标题:Mojo::EventEmitter

        本文链接:https://www.haomeiwen.com/subject/aorobttx.html