0

私はこの問題の解決策を得ようとしていました。しかし、どういうわけか、私はそうすることができません、なぜなら角度5 における知識不足のものとすることができるこれは私のサービスです。角度5で同期呼び出しを行う方法は?

GetCurrentUserData(): Observable<ResponseData> { 
    return this.http.get<ResponseData>(ApplicationURLS.GetCurrentUserInformation) 
     .map(response => { 
      return response; 
     }); 
    //.catch(error => this.handleError(error)); 
} 

は、これは私のコンポーネントです:

私はここで
public GetCurrentUserInformation(): any { 

     return this.loginService.GetCurrentUserData().subscribe(data => { return data; }); 
    } 

データにアクセスしようとしている:私はthis.responseDataをチェックすると

ngAfterViewInit() { 
     debugger;     
     this.responseData = this.GetCurrentUserInformation(); 
     if (this.responseData.code != responseCodes.success) { 
      this.googleInit(); 
     } 

    } 

それは常に私がデータを必要代わりにこれを返している: enter image description here

すぐにデータを取得できるように、同期呼び出しを行いたいだけです。

サービスでdo()を使用しようとしましたが、戻り値do()は関数ではありません。

答えて

2

:コードがにリファクタリングすることができます必ずお使いの非同期呼び出しが受信した応答に依存固有のロジックを実行する前に実行されるようにするではない角度の問題))

this.GetCurrentUserInformation().subscribe((data: ResponseData) => { 
     if (this.responseData.code != responseCodes.success) { 
      this.googleInit(); 
     } 
}); 
+0

正確には、私はそれを実現し、それに応じて変更を加えましたが、現在は期待どおりに動作しています。 –

1

非同期関数は非同期であるため、同期的に呼び出すことはできません。

subscribeは、通常、連鎖すると予想される方法では実行しないでください。たとえそれが必要であっても、観察可能なサブスクリプションではなく、サブスクリプションではないサブスクリプションをメソッドから返す必要があります(サブスクリプションをさらに保存して破棄することができます)。

GetCurrentUserInformationは、サービスコール用のラッパーなので冗長です。 HTTP呼び出しは非同期(ジャバスクリプトエンジンはシングルスレッドで実行されるため、すべてのブラウザのAPI呼び出しは、非同期である(これは、より多くのためのブラウザイベントループのためのgoogleでGetCurrentUserData()に登録

ngAfterViewInit() { 
    this.loginService.GetCurrentUserData().subscribe(data => { 
     this.responseData = data; 
     if (this.responseData.code != responseCodes.success) { 
      this.googleInit(); 
     } 
    }); 
} 
+0

Yup、+ 1は最初に関数を完了することを意味しました。しかし、あなたが指摘したようにはい、G.viteliは今私がそれを理解できるように助けます。 –

0

もう一つの方法は、ReactiveXから)(Observable.forkJoin使用することです。私は自分のフォームにこのパターンをたくさん使っています。

Observable.forkJoin(
    this.http.get('/links.json').map((response:Response) => response.json()), 
    this.http.get('/bookmarks.json').map((response:Response) => response.json()) 
).subscribe(
    data => { 
     this.links = data[0] 
     this.bookmarks = data[1] 
    }, 
    error => console.error(error) 
); 

onNextハンドラは、一度だけ実行され、そして唯一の完全なすべてのHTTP要求の後に成功 は輸入品を忘れないでください:

import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 

は、ここでは詳細にこのアプローチを説明link to the articleです。

関連する問題