2017-04-03 12 views
0

私には、ドロップダウンリストのデータを返す関数を持つ角度2のサービスがあります。関数は約束を返します。以下のサービスからWebサービスの呼び出しが完了する前に、約束によるWebサービスへのAngular2呼び出しが解決されました。

コード:このデータを使用してドロップダウンが最新のデータを持つことになりますので、

getStuff(): Promise<Stuff> 
    { 
      return this.http.get("http://myserver/myServices/myService.svc/rest/getStuff") 
      .map(res => this.dataHandler.extractData(res)).toPromise() 
      .catch(err => this.dataHandler.handleHttpError(err)); 
    } 

私は、新しい保存されたデータを更新するために保存したイベントからこの関数を呼び出します。

私のコードこのサービスを呼び出す:

ngOnInit() 
    { 
     this.onSavedSubscription = this.OnSaved.subscribe((data: any) => 
     { 
     if (data.IsSuccessful) 
     { 
      this.myService.getStuff().then(
       res=> 
       { 
        this.myService.stuffs = res; 
       } 
      ); 
     } 
    } 

上記のコードが呼び出されると、getStuff関数が呼び出されますが、それはデータベースから更新されたデータを返すことができます前に、コードの実行は、「それから」と塗りつぶしに移行resに含まれる古いデータを持つthis.myService.stuffs。何が起こっているのか分かりません。 getStuffの実行が終了して新しいデータが返されるまで、「then」は実行されないと思いました。助けてください。

+0

あなたは正しいことを考えていますが、約束事が解決される前にgetStuff()。then()を実行すべきではありません。 M.b.あなたはこの部分と衝突する他のコードを持っています、それは伝えにくいです。 – metamaker

+0

コメントありがとうございました。はい、私はgetStuff()と思っていましたが、then()はgetStuffの終了後にのみ実行され、getStuffから返されるデータはgetStuff()、then()のres引数になります。これは初めての動作ですが、その後のgetStuff()。then()はgetStuff()が終了する前に実行され、resには古いデータが格納されます。 – LanceM

答えて

0

私は挙動の理由は、データが私は次のようにサービスを変更し、キャッシュされていたことがわかった:

getStuff(useCachedData: boolean = true): Promise<Stuff> 
{ 
    if (useCachedData) 
    { 
     return this.http.get("http://myserver/myServices/myService.svc/rest/getStuff") 
      .map(res => this.dataHandler.extractData(res)).toPromise() 
      .catch(err => this.dataHandler.handleHttpError(err)); 
    } 
    else 
    { 
     let headers = new Headers(); 
     headers.append('Cache-control', 'no-cache'); 
     headers.append('Cache-control', 'no-store'); 
     headers.append('Expires', '0'); 
     headers.append('Pragma', 'no-cache'); 


     return this.http.get("http://myserver/myServices/myService.svc/rest/getStuff", { headers: headers }) 
      .map(res => this.dataHandler.extractData(res)).toPromise() 
      .catch(err => this.dataHandler.handleHttpError(err)); 
    } 
} 

私はキャッシュするかしないかを選択することができますこの方法を。私が何かが欠けている場合や、キャッシュする時期を選択するためのより良い/よりシンプルな方法があります。

関連する問題