我正在使用可注射的角服务来提供整个应用程序的日期。
此日期值取决于对服务器的http.get()
请求。
constructor(...)
{
this.http.get(...).subscribe(r => { this.foo = r; });
}
public getFoo() : Date
{
return Bar.dateFrom(this.foo);
}
有什么办法可以确保请求完成,并且在将服务提供给组件之前填充了this.foo
吗?
我知道我可以返回Observable<Date>
,到处都可以返回.subscribe()
,但是在整个应用程序中,许多地方都会使代码更加复杂且易于阅读,只能涵盖一个极端情况/种族条件。
还有其他方法可以确保我们最初等待请求回来吗?无论如何,其余的应用程序都不能没有任何东西,所以我不介意在这里同步...
事实证明,这样做的正确方法是将以下内容包括在 app.module.ts
中:
export function initConfig(foo: MyImportantService)
{
return () =>
{
return foo.load();
};
}
@NgModule({
...
providers:
[
...
MyImportantService,
{ provide: APP_INITIALIZER, useFactory: initConfig, deps: [MyImportantService], multi: true }
...
]
并让您的服务实现load
方法:
public load() : Promise<any>
{
this.http.get(...)
.map((res) => res.json())
.toPromise()
.then((r) => {
this.importantVariable = r;
});
}
这样,APP_INITIALIZER
将在加载应用程序之前等待承诺解决的承诺,您可以直接从服务返回变量而无需通过可观察到的。
在您的http呼叫中,
this.http.get(...).subscribe(
r => { this.foo = r; },
(error)=> console.log(error),
()=> // call completed. Do something);
在订阅的第三个参数中,您的http调用已完成,在这里您可以为呼叫完成后要做的代码编写代码。