2016-06-07 2 views
2

В моем приложении есть угловая услуга 2, которая позволяет сказать «Служба конфигурации», которая возвращает последовательность RxJS Observable. Эта последовательность содержит данные конфигурации. При подписке на эту последовательность он возвращает данные, однако данные возвращаются асинхронно. В обычном сценарии может потребоваться асинхронный вызов, однако в одном конкретном случае мне нужно получить данные конфигурации «синхронно», так как без данных конфигурации, возвращаемых из потока выполнения службы, не может продолжаться. Есть ли способ сделать блокирующий вызов с наблюдаемой последовательностью, чтобы я мог использовать эту существующую конфигурационную службу? Мой код выглядит примерно так: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

Невозможно синхронно переворачивать вещи.

Подход, который вы можете рассмотреть, заключается в загрузке данных конфигурации перед загрузкой приложения. Таким образом, они будут присутствовать при запуске приложения.

Вот различные возможные подходы:

  • Вы можете самонастройки асинхронно после запроса (ов) полной (ов). Вот пример:

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

    Посмотреть этот вопрос для получения дополнительной информации:

Смежные вопросы