什么是 GenEvent

GenEvent 是一个用来实现函数化的事件处理行为的模块.

事件处理模型包含了一个通用的事件管理进程, 以及多个可以被动态添加和删除的事件句柄.

例子

GenEvent 有许多应用场景, 例如, 构建一个日志收集系统. 不同的 log 消息对应不同的处理方式. 有的消息会在终端打印出错误信息, 有的会写入文件, 有的会保存在内存中.

# 定义一个事件处理者
defmodule LoggerHandler do
  use GenEvent

# 定义回调

  def handle_event({:log, x}, messages) do
    {:ok, [x | messages]}
  end

  def handle_call(:messages, messages) do
    {:ok, Enum.reverse(messages), []}
  end
end

# 启动一个新的事件管理者

{:ok, pid} = GenEvent.start_link([])

# 将处理者添加到到管理者名下

GenEvent.add_handler(pid, LoggerHandler, [])

#=> :ok

# 发送一些事件给管理者.

GenEvent.notify(pid, {:log, 1})

#=> :ok

GenEvent.notify(pid, {:log, 2})

#=> :ok

# 调用管理者名下特定的处理者.

GenEvent.call(pid, LoggerHandler, :messages)

#=> [1, 2]

GenEvent.call(pid, LoggerHandler, :messages)

#=> []

Ljzn
399 声望102 粉丝

网络安全;函数式编程;数字货币;人工智能