У меня есть служба Angular 2, которая должна выполнять асинхронную работу при инициализации, и ее нельзя использовать до завершения этой инициализации.
@Injectable()
export class Api {
private user;
private storage;
constructor(private http: Http) {
this.storage = LocalStorage;
this.storage.get('user').then(json => {
if (json !== "") {
this.user = JSON.parse(json);
}
});
}
// one of many methods
public getSomethingFromServer() {
// make a http request that depends on this.user
}
}
В настоящее время эта служба инициализируется и немедленно возвращается к любому компоненту, который ее использует. Затем этот компонент вызывает getSomethingFromServer()
в своем ngOnInit
, но в этот момент Api.user не инициализируется, и поэтому отправляется неверный запрос.
Хуки жизненного цикла (OnInit
, OnActivate
и т. д.) не работают с сервисами, только с компонентами и директивами, поэтому я не могу их использовать.
Для сохранения промиса из вызова get()
потребуются все различные методы, которые зависят от пользователя, чтобы дождаться его, что приведет к большому дублированию кода.
Каков рекомендуемый способ асинхронной инициализации сервисов в Angular 2?
APP_INITIALIZER
может быть подходом в некоторых сценариях, например. если вы хотите, чтобы инициализация вызывалась только один раз, см. пример здесь stackoverflow.com/questions/49686406/ Я понимаю, что на ваш вопрос уже дан ответ, но это может быть полезно для дальнейшего использования - person wal   schedule 05.06.2019