事件

AdonisJs 附带专门的活动提供商。

在内部,它使用 EventEmitter2 包,并在其上添加了其他方便的功能。

该事件提供了一个假的实现,可编写测试时使用的断言。

活动概述

事件侦听器在 start/events.js 文件中定义。

事件侦听器可以定义为闭包,或者你可以绑定 IoC 容器命名空间:

Event.on('new::user', async (user) => {
})

// OR
Event.on('new::user', 'User.registered')

Namespaced 事件侦听器存储在 app/Listeners 目录中。

将侦听器绑定到事件时,不需要输入整个命名空间。例如,存储为的侦听器 app/Listeners/User.js 被引用为 User.

make:listener 命令可用于创建新的事件侦听器:

> adonis make:listener User
# 输出
✔ create  app/Listeners/User.js

基本例子

假设我们想在每次用户在我们的网站上注册时发出一个事件,并且在事件监听器内部,向注册用户发送一封电子邮件。

首先,我们需要创建相关的路由和控制器:

Route.post('register', 'UserController.register')
const Event = use('Event')

class UserController {
  register () {
    // register the user

    Event.fire('new::user', user)
  }
}

接下来,我们需要一个监听器, new::user 以便我们发送电子邮件。

为此,请 events.js 在 start 目录中创建一个文件:

# Mac / Linux
> touch start/events.js

# Windows
> type NUL > start/events.js

最后,在 start/events.js 文件中编写我们的事件处理代码:

const Event = use('Event')
const Mail = use('Mail')

Event.on('new::user', async (user) => {
  await Mail.send('new.user', user, (message) => {
    message.to(user.email)
    message.from('from@email')
  })
})

如你所见, AdonisJs 可以在事件侦听器回调中轻松使用 await 关键字。

API

以下是可用于与事件提供程序交互的方法列表。

on(event, listener)

为给定事件绑定单个或多个侦听器。 listener 可以是一个闭合功能或参照一个(或多个) IoC 容器绑定:

Event.on('new::user', async () => {

})

// IoC container binding
Event.on('new::user', 'User.registered')

// Array of listeners
Event.on('new::user', ['Mailer.sendEmail', 'SalesForce.trackLead'])

when(event, listener)

when 方法使 on 方法别名。

once(event, listener)

与on相同,但只调用一次:

Event.once('new::user', () => {
  console.log('executed once')
})

onAny(listener)

绑定任何事件的监听器:

Event.onAny(function () {

})

// Ioc container binding
Event.onAny('EventsLogger.track')

times(number)

times 方法与 on 或 when 应限制侦听器应被触发的次数:

Event
  .times(3)
  .on('new::user', () => {
    console.log('fired 3 times')
  })

emit(event, data)

使用可选数据发出事件:

Event.emit('new::user', user)

fire(event, data)

fire 方法是 emit 方法的别名。

removeListener(event, listener)

删除给定事件的侦听器:

Event.on('new::user', 'User.registered')

// later remove it
Event.removeListener('new::user', 'User.registered')

你必须绑定IoC容器引用以便稍后将其删除。

off(event, listener)

off 方法为 removeListener 方法的别名。

removeAllListeners(event)

删除给定事件的所有侦听器:

Event.removeAllListeners()

listenersCount(event)

返回给定事件的侦听器数量:

Event.listenersCount('new::user')

getListeners(event)

返回给定事件的侦听器数组:

Event.getListeners('new::user')

hasListeners(event)

返回一个boolean指示是否有给定事件的侦听器:

Event.hasListeners('new::user')
最后一次更新: 7/6/2019, 11:30:34 PM