确保异步服务初始化完成



我正在使用可注射的角服务来提供整个应用程序的日期。
此日期值取决于对服务器的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调用已完成,在这里您可以为呼叫完成后要做的代码编写代码。

最新更新