Javascript 如何处理从基类构造函数调用的派生类中的事件?
我认为这更多的是一个设计问题,但这里是 我有一个使用Typescript的web应用程序。 我有一个从基类继承的类。 基类在其构造函数中调用一些初始化代码(如download.xml文件)。 下载完成后,它会调用一个事件(例如Init_Completed) 现在,我需要派生类来处理这个事件。我知道我可以在基类中注册此事件,并在派生类中重载该处理程序方法 但是,我需要派生类能够注册此事件处理程序,如下所示:Javascript 如何处理从基类构造函数调用的派生类中的事件?,javascript,javascript-events,event-handling,typescript,Javascript,Javascript Events,Event Handling,Typescript,我认为这更多的是一个设计问题,但这里是 我有一个使用Typescript的web应用程序。 我有一个从基类继承的类。 基类在其构造函数中调用一些初始化代码(如download.xml文件)。 下载完成后,它会调用一个事件(例如Init_Completed) 现在,我需要派生类来处理这个事件。我知道我可以在基类中注册此事件,并在派生类中重载该处理程序方法 但是,我需要派生类能够注册此事件处理程序,如下所示: this.OnLoaded += this.LoadedCompleted; 问题是:
this.OnLoaded += this.LoadedCompleted;
问题是:
如何正确地设计这个?。。。因为加载是在中启动的
基类构造函数。这意味着加载的事件可能是
在派生类有机会注册/侦听之前调用
这件事
在调用基类构造函数之前,可以初始化子类中的成员:
class A{
constructor(){
// register here
}
}
class B extends A{
b;
constructor(){
this.b = 123; // Setup members here
super();
}
}
如何正确地设计这个?在派生类更改为此事件注册/侦听之前,可以调用加载的事件
我建议对这类只触发一次的事件使用承诺,比如文件的load
事件。承诺确实很好地解决了这一问题
- 它们支持多个独立的处理程序
- 注册时间无关紧要-当值可用时,每个处理程序都会尽快执行
您可以,并且您可以免费获得简单的错误处理和链接/合成。我不确定我是否正确理解了您的问题。在我看来,你并不需要一个活动: 考虑:
class Base {
constructor() {
init(this.afterInit.bind(this));
}
init(callback: Function): void {
//Do something asynchronous
}
afterInit() {
//Do something after initialization
}
}
class Derived extends Base {
constructor() {
super();
}
afterInit() {
super.afterInit();
//Do something else after initialization
}
}
但如果必须使用事件:
class MyEvent {
register(handler: (sender: any) => void) {
//Put the handler in a collection
}
raise() {
//Invoke all the handlers
}
}
class Base {
onAfterInit = new MyEvent();
constructor() {
init();
}
init(): void {
//Do something asynchronous
//Then invoke the event
this.onAfterInit.raise();
}
}
class Derived extends Base {
constructor() {
super();
}
init() {
this.onAfterInit.register(sender => {
//Do something after initialization
})
super.init();
}
}
注册处理程序后只需调用super.init。这有帮助吗?我建议使用一个off-sides EventEmitter在一个集中的位置处理所有事件。@RobG这是typescriptChange基类,以便调用在一个额外的方法(由构造函数调用)中。然后在子类中覆盖该方法。在该重写方法中添加或更改eventhandler,然后调用基类的方法(super.methodName();)。感谢您的输入。但我认为这并不能解决问题。问题是类B注册了一个处理程序(例如:super.onload.Add(this.MyLoaded);请注意,这个注册过程必须在super()之后进行。因为super()是将最终调用我的已加载事件,类B可能会也可能不会及时注册以处理该事件。不能保证在类A调用该事件时类B已准备就绪。要添加到我之前的注释中,类B中的变量B实际上在类A中(在我的情况下)。因此这不起作用,因为类A(即超级)尚未正式实例化。因此A.b未定义。