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) 触发事件

posted @ 2022-08-03 11:16  theiaide  阅读(133)  评论(0编辑  收藏  举报