2017-03-03 10 views
2

私は2つのAPP_INITIALIZERプロバイダを持っています...最初に環境情報を取得するためのHTTP要求を行います。角2 APP_INITIALIZER実行順序/非同期の問題

環境情報を使用して、OIDC Authorityサーバーエンドポイント(環境呼び出しから取得)に対してユーザーを認証します。

環境サービスを認可サービスの依存関係にするにもかかわらず、認可サービスのAPP_INITIALIZERファクトリ関数は、環境呼び出しが完了する前に呼び出されるようです。 APP_INITIALIZERに提供

{ provide: APP_INITIALIZER, multi: true, useFactory: EnvironmentFactory, deps: [] } 
{ provide: APP_INITIALIZER, multi: true, useFactory: AuthorizationFactory, deps: [EnvironmentProvider] } 

両工場では、署名である:

Factory() { return() => Promise; } 

結果は、許可呼び出しではなく、適切なURLのundefinedに提出するということです。

私は工場を組み合わせることを考えましたが、それは2つの異なるモジュールに分かれているので面倒です。ガイダンスが評価されました!

+0

もっとコードを入力してください。 'AuthorizationFactory'は' EnvironmentFactory'が応答を受け取った時を知る方法を持っていないと思います。 –

+2

他に何ができるのか分かりません。私は、AuthorizationFactoryがEnvironmentFactoryの約束がいつ解決されたのか分からないことを理解します。それは基本的に質問の精神だと思います。 APP_INITIALIZERを解決するために別のAPP_INITIALIZERを待機させる方法可能であれば、内部的に行う工場を持たない方がいいですね。 EnvironmentAndAuthorizationFactory() –

答えて

0

私は解決されたEnvironmentProviderをAuthorizationFactoryに注入しました。

オーソリティ値が変更されたときにいつでも発行されるEnvironmentProviderにオブザーバブルを追加しました。私はenv.Authority $(のソースとしてReplaySubject(1)を使用

{ provide: APP_INITIALIZER, multi: true, 
    useFactory: EnvironmentFactory, deps: [EnvironmentProvider] } 

{ provide: APP_INITIALIZER, multi: true, useFactory: AuthorizationFactory, 
    deps: [AuthorizationProvider, EnvironmentProvider] } 


export function AuthorizationFactory (auth: AuthorizationProvider, env: EnvironmentService) { 
    return new Promise((resolve, reject) => env.Authority$() 
     // don't emit until authority provider has a value 
     .skipWhile(authority => !authority) 
     // dispatch the auth command to ngrx/store. 
     .do(() => store.dispatch({ type: 'AuthorizeIdentity' })) 
     // switch to observe identity state 
     .switchMap(() => store.select('Identity')) 
     // don't emit until there is an identity (async authorization complete). 
     .skipWhile(identity => !identity) 
     // finish. 
     .take(1) 
     .subscribe(resolve, reject) 
    }); 
} 

)。これにより、返されたobservableは、AuthorizationFactoryによるサブスクリプション(例えば、オーソリゼーションがAuthorizationFactoryサブスクリプションの前に解決された場合など)で常に放出されます。

なぜ私がtoPromise()を使用していないのか不思議に思っている人は...私はいくつかの問題があると思います(私はここで検討のために提出しました)。 https://github.com/Reactive-Extensions/RxJS/issues/1429

+0

私はあなたが約束の代わりに約束を返す関数を返すべきだと思います。アイデアありがとう! – alexseik