我正在使用注射角度服务在我的应用程序中提供日期
此Date值取决于对服务器的http.get()
请求。
constructor(...)
{
this.http.get(...).subscribe(r => { this.foo = r; });
}
public getFoo() : Date
{
return Bar.dateFrom(this.foo);
}
有什么方法可以确保请求完成并且在服务可用于组件之前填充this.foo
?
我知道我可以在任何地方返回Observable<Date>
而不是.subscribe()
,但这会使整个应用程序中许多地方的代码更复杂,更不易读,只能涵盖一个极端情况/竞争条件。
还有其他方法可以确保我们最初等待请求回来吗?如果没有它,应用程序的其余部分都无法做到,所以我不介意它在这里同步...
答案 0 :(得分:0)
在你的http电话中,
this.http.get(...).subscribe(
r => { this.foo = r; },
(error)=> console.log(error),
()=> // call completed. Do something);
在订阅的第三个参数中,您的http调用已完成,您可以在此处编写完成调用后您希望执行的操作的代码。
答案 1 :(得分:0)
原来这样做的正确方法是在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
将在加载应用程序之前等待Promise解析,您可以直接从服务返回变量,而无需通过Observable。