【问题标题】:Wait for another observable before proceeding在继续之前等待另一个可观察的
【发布时间】:2016-06-28 08:58:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    不,因为 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 有一个工作示例

    【讨论】:

    • 但是这会导致多个http请求对吧?我怎样才能只发出一个 http 请求并防止所有后续的 loadData 调用被忽略(但在第一次调用完成后给它们回调)
    • 所以数据在整个运行时都保持不变?
    • 是的,它只是对获取和缓存的初始调用。可能有更好的方法吗?
    • 好的,所以我尝试并构建了一些可以解决您问题的东西。马上更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 2022-08-19
    • 2012-05-04
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多