RxJS阻塞呼叫

时间:2016-06-07 16:43:58

标签: angular rxjs

在我的应用程序中,有角度2服务可以说"配置服务"返回RxJS Observable序列。该序列包含配置数据。在订阅此序列时,它返回数据,但返回的数据是异步的。在正常情况下,可能需要异步调用,但是在一个特定情况下,我需要获得此配置数据"同步"因为没有那个配置从服务执行流返回的数据无法继续。有什么方法可以用可观察的序列进行阻塞调用,这样我仍然可以使用这个现有的配置服务吗?我的代码如下所示:

this.configService.getConfigData()
        .subscribe(
            x=>{                    
                this.ConfigData = x;                    
            },
            e=>console.log(e)
        );

1 个答案:

答案 0 :(得分:1)

没有办法同步转动。

您可以考虑的方法是在引导应用程序之前加载配置数据。因此,当应用程序启动时,它们将在那里。

以下是不同的可能方法:

  • 您可以在请求完成后异步引导。这是一个示例:

    var app = platform(BROWSER_PROVIDERS)
      .application([BROWSER_APP_PROVIDERS, appProviders]);
    
    var service = app.injector.get(ConfigService);
    
    service.loadConfig().flatMap((config) => {
      var configProvider = new Provider('config', { useValue: config });
      return app.bootstrap(appComponentType, [ companiesProvider ]);
    }).toPromise();
    

    看到这个问题:

  • 如果您能够在服务器端更新index.html页面(主入口点),我会看到另一种方法。这是一个示例:

    <script>
      var params = {"token": "@User.Token", "xxx": "@User.Yyy"};
      System.import('app/main').then((module) => {
        module.main(params);
      });
    </script>
    

    看到这个问题:

  • 您还可以为此注册APP_INITIALIZER提供商:

    provide(APP_INITIALIZER, {
      useFactory: (service:ConfigService) => () => service.loadConfig(), 
      deps:[ConfigService, HTTP_PROVIDERS],
      multi: true}),
    

    有关详细信息,请参阅此问题: