确保异步服务初始化完成?

时间:2017-09-11 11:39:42

标签: angular

我正在使用注射角度服务在我的应用程序中提供日期 此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(),但这会使整个应用程序中许多地方的代码更复杂,更不易读,只能涵盖一个极端情况/竞争条件。

还有其他方法可以确保我们最初等待请求回来吗?如果没有它,应用程序的其余部分都无法做到,所以我不介意它在这里同步...

2 个答案:

答案 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。