继续之前等待另一个观察者

时间:2016-06-28 08:58:44

标签: angular rxjs

我不知道是否应该为此发布任何代码。但如果需要我会的。我有一个Angular2指令MyDirective和一个服务MyService

该服务在其构造函数中进行http调用以获取内容并以this.list存储。

Directive注入服务并将其用作myService.isPresent(item)

现在,问题在于,通过time指令执行,用于获取服务中列表的http调用尚未完成。有没有一种干净的方法让指令等到服务准备好了?

1 个答案:

答案 0 :(得分:2)

不,由于http调用始终是异步的,因此您无法同步等待它们。

然而,您可以自己使用ReflectiveInjector实例化服务,并在引导应用程序之前调用初始化,以确保所有内容都已加载。

bootstrap来电中,只需向您的MyService实例提供数据。

//import ... from ...
import {MyService} from './my.service';

let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS, MyService]);
var myService: MyService = injector.get(MyService);

myService.init()
  .subscribe(data => {
    bootstrap(App, [
      HTTP_PROVIDERS,
      provide(MyService, {useValue: myService})
    ])
    .catch(err => console.error("error: ", err));
  });

MyService添加此init方法,为您的数据加载返回Observable

init(): Observable<any> {
  if (!this._initialized) {
    this._initialized = true;
    return this._http.get(this._url)
      .map(data => { 
        this._data = data.json();
        return this._data;
      });
  }
  else {
    console.log("Already initialized!");
  }
}
  

Plunker有一个工作示例