2016-06-07 117 views
2

在我的應用程序中有角度2服務可以說「配置服務」,它返回RxJS可觀察序列。該序列包含配置數據。在訂閱這個序列時,它返回數據,但返回的數據是異步的。在正常情況下,可能需要異步調用,但是在一個特定情況下,我需要「同步」獲取此配置數據,因爲沒有從服務執行流返回的配置數據無法繼續。有沒有什麼辦法可以通過可觀察序列阻塞呼叫,以便我仍然可以使用這個現有的配置服務?我的代碼如下所示:RxJS阻塞呼叫

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

參見http://stackoverflow.com/questions/37611549/how-to-pass-parameters-rendered-from-backend-to-angular2-bootstrap-method/37611614#37611614 –

回答

1

沒有辦法讓事情同步。

您可以考慮的方法是在引導應用程序之前加載配置數據。所以他們會在應用程序啓動時到達那裏。

這裏有不同的可能的方法:

  • 你可以你的要求(S)完成(一個或多個)之後,非同步引導。下面是一個示例:

    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}), 
    

    詳見本期更多詳情: