Theia 事件
Theia中的事件可能会令人困惑,希望我们能澄清一下。
让我们看看这段代码:
(来自 logger-watcher.ts)
@injectable() export class LoggerWatcher { getLoggerClient(): ILoggerClient { const emitter = this.onLogLevelChangedEmitter return { onLogLevelChanged(event: ILogLevelChangedEvent) { emitter.fire(event) } } } private onLogLevelChangedEmitter = new Emitter<ILogLevelChangedEvent>(); get onLogLevelChanged(): Event<ILogLevelChangedEvent> { return this.onLogLevelChangedEmitter.event; } }
从下面这句开始讲解
private onLogLevelChangedEmitter = new Emitter<ILogLevelChangedEvent>();
那么首先什么是Emitter?
Emitter 是一个事件处理程序容器,它允许在其上注册事件处理程序并使用 X 类型的事件。在本例中为 ILogLevelChangedEvent 触发。
所以这里我们只创建一个 Emitter,它具有 ILogLevelChangedEvent 类型的事件;
接下来,我们希望能够在此 Emitter 上注册一个事件处理程序,因此我们这样做:
get onLogLevelChanged(): Event<ILogLevelChangedEvent> { return this.onLogLevelChangedEmitter.event; }
这实际上返回的是一个函数,这个函数就是这个事件的处理函数,因此您只需将事件处理程序函数传递给它,它就会注册它,以便在事件触发时调用它。
所以你可以这样调用:
(来自 logger.ts)
/* Update the root logger log level if it changes in the backend. */ loggerWatcher.onLogLevelChanged(event => { this.id.then(id => { if (id === this.rootLoggerId) { this._logLevel = Promise.resolve(event.newLogLevel); } }); });
这将注册作为此Emitter的参数传递的匿名函数。
接下来我们需要通过触发一个事件来触发这个事件处理程序:
onLogLevelChanged(event: ILogLevelChangedEvent) {
emitter.fire(event)
}
调用此函数时,Emitter被触发并调用所有事件处理程序。
所以如果需要在theia中触发事件:
1 创建发射器
2 使用emitter.event 函数注册事件
3 使用emitter.fire(event) 触发事件