Представьте себе следующую ситуацию:
Вы хотели бы реализовать службу Angular, которая должна существовать в двух модах: одна, использующая конечную точку REST, и другая, которая работает как фиктивная, не имея зависимости от конечной точки. Служба REST должна использоваться в производственной среде, а макет - в разработке.
Поскольку у обеих реализаций много общего, они оба выходят из абстрактного класса. Поскольку служба (не имеет значения, какая конкретная реализация) должна вызываться на основе некоторых входящих событий, соответствующая подписка помещается в конструктор абстрактного суперкласса.
abstract class AService {
constructor(someServiceEmittingEvents) {
someServiceEmittingEvents.subscribe(() => {
this.doSomething();
});
};
abstract doSomething(): void;
}
class RestService extends AService {
constructor(someServiceEmittingEvents, private httpClient: HttpClient) {
super(someServiceEmittingEvents);
}
doSomething(): void {
this.httpClient.post(...);
}
}
class MockService extends AService {
constructor(someServiceEmittingEvents) {
super(someServiceEmittingEvents);
}
doSomething(): void {
...
}
}
Пожалуйста, рассмотрите блок кода как псевдосинтаксис.
Когда предоставляется RestService, время от времени случается, что событие генерируется и обрабатывается, пока сам сервис находится "в разработке". Это приводит к тому, что метод doSomething
вызывается в RestService, в то время как HttpClient не был назначен, поэтому он не определен при вызове doSomething
.
По крайней мере, так это выглядит, когда регистрируются вызовы конструктора и метода, и это звучит для меня вполне осуществимо.
Поскольку у сервисов Angular нет хуков жизненного цикла, как у компонентов, я бы хотел спросить, каким будет подходящий способ.