Существуют различные варианты, но я бы возвратил Observable из метода init
, хотя я предпочитаю добавить суффикс Async
к моим методам, которые возвращают наблюдаемые или обещания.
import { shareReplay, map } from 'rxjs/operators';
public initAsync(): Observable<BackendService> {
const merged = zip(this.getAliases(), this.getDeclarations()).pipe(shareReplay());
merged.subscribe(([aliases, declarations]) => {
this.aliases = aliases;
this.aliasDeclaration = declarations;
// i need to set ready = true here, but can't figure out how :)
});
return merged.pipe(map(() => this));
}
shareReplay
гарантирует, что используется тот же результат. Я также возвращаю сам сервис из Observable, хотя в этом нет необходимости. Абоненту легко пользоваться услугой, которая уже готова, но возвращать все, что вы хотите.
Телефонный код
ngOnInit() {
this.service.initAsync().subscribe(_ => /*do something*/);
}