2017-09-11 5 views
0

私は、私のアプリケーションを通してDateを提供するために注射可能な角度サービスを使用しています。
この日付の値は、サーバーへのhttp.get()要求によって異なります。非同期サービスの初期化が完了していることを確認しますか?

constructor(...) 
{ 
    this.http.get(...).subscribe(r => { this.foo = r; }); 
} 

public getFoo() : Date 
{ 
    return Bar.dateFrom(this.foo); 
} 

私はサービスがコンポーネントに利用可能になる前に、要求が完了するとthis.fooが移植されていることを確認することができます方法はありますか?
代わりにObservable<Date>.subscribe()を返すことができると理解していますが、アプリケーション全体の多くの場所でコードが複雑になり、極端なケース/競合状態をカバーするために読みにくくなります。

最初にリクエストが返ってくるのを待つようにする方法はありますか?ことはできませんとにかくそれなしで何でもへのアプリケーションの残りの部分なので、私はそれがここに同期する気にしないだろう...あなたのHTTP呼び出しで

答えて

0

これを行うための正しい方法はapp.module.tsに次のように含めることですが判明:

export function initConfig(foo: MyImportantService) 
{ 
     return() => 
     { 
     return foo.load(); 
     }; 
} 

@NgModule({ 
... 
    providers: 
     [ 
     ... 
     MyImportantService, 
     { provide: APP_INITIALIZER, useFactory: initConfig, deps: [MyImportantService], multi: true } 
     ... 
     ] 

とあなたのサービスは以下のようにloadメソッドを実装します:

public load() : Promise<any> 
{ 
    this.http.get(...) 
    .map((res) => res.json()) 
    .toPromise() 
    .then((r) => { 
     this.importantVariable = r; 
    }); 
} 

APP_INITIALIZERがお待ちしております。この道をプロミスがアプリケーションをロードする前に解決し、Observableを経由することなくサービスから変数を直接返すことができます。

0

購読の三番目のパラメータで
this.http.get(...).subscribe(
r => { this.foo = r; }, 
(error)=> console.log(error), 
()=> // call completed. Do something); 

、あなたのhttp呼び出しが完了し、ここであなたは、呼び出しが完了した後にやりたいことのためのコードを書くことができます。

関連する問題