You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1000 B
Lua
44 lines
1000 B
Lua
local channel = require "channel"
|
|
|
|
local EventEmitter = {}
|
|
function EventEmitter:new()
|
|
local obj = {
|
|
events = {}, -- 监听的所有事件
|
|
channels = {}, -- event: channel
|
|
}
|
|
setmetatable(obj, self)
|
|
self.__index = self
|
|
return obj
|
|
end
|
|
|
|
function EventEmitter:registerEvent(name, desc)
|
|
self.events[name] = desc
|
|
end
|
|
|
|
function EventEmitter:registerCallback(event, callback)
|
|
assert(event)
|
|
assert(callback)
|
|
if not self.events[event] then
|
|
error("not register event: "..event)
|
|
end
|
|
local ch = self.channels[event]
|
|
if not ch then
|
|
ch = channel:new(event)
|
|
self.channels[event] = ch
|
|
end
|
|
ch:on(callback)
|
|
end
|
|
|
|
function EventEmitter:emit(event, ...)
|
|
if not self.events[event] then
|
|
error("not register event: "..event)
|
|
end
|
|
|
|
local ch = self.channels[event]
|
|
if not ch then return end
|
|
|
|
for _, listener in ipairs(ch.listeners) do
|
|
listener.callback(...)
|
|
end
|
|
end
|
|
return EventEmitter |