2017-03-15 16 views
0

私はAngular 2 Appで2つの順次HTTPリクエストを実装しようとしています。 ユーザーがログインボタンをクリックすると、LocalStorageにリフレッシュとアクセストークンを保存し、もう1つのHTTPリクエストを実行してユーザー情報を取得します。私はこの投稿を見ましたが、私の場合はうまくいきません。 Angular 2 - Chaining http requests角2 - シーケンシャルなHTTPリクエスト

これはログインとgetMeサービスのための私の最初の実装でした: どのようにリクエストをマージできますか?

login.component.ts

this.authenticationService.login(this.user.email, this.user.password) 
     .subscribe(
     data => { 
      // this.alertService.success('Registration successful', false); 
      this.router.navigate([this.returnUrl]); 
     }, 
     error => { 
      console.log(error); 
      this.alertService.error(error); 
      this.loading = false; 
     }); 

authentication.service.ts

login(email: string, password: string) { 
    let headers = new Headers({ 
     'Content-Type': 'application/json', 
     'X-Requested-With': 'XMLHttpRequest', 
     'Cache-Control': 'no-cache' 
    }); 
    let options = new RequestOptions({ headers: headers }); 
    return this.http.post(this.config.apiUrl + this.authenticationUrl + '/login', 
     JSON.stringify({ email: email, password: password }), options) 
     .map((response: Response) => { 
      let tokens = response.json(); 
      if (tokens && tokens.token && tokens.refreshToken) { 
       // store user details and jwt token in local storage to keep user logged in between page refreshes 
       localStorage.setItem('tokens', JSON.stringify(tokens)); 
      } 
     }); 
} 

user.service.ts

getMe() { 
    console.log('getMe'); 
    return this.http.get(this.config.apiUrl + this.usersUrl + '/me', this.jwt()).map((response: Response) => { 
     let user = response.json(); 
     if (user) 
      localStorage.setItem('currentUser', JSON.stringify(user)); 
    }); 
} 
+0

まず、あなたの関数は、約束または(例えば、約束)コールバックを返すことができます。プロミスを使用する場合は、結果を(.then、.catch)で連結することができます。コールバックを渡す場合、コールバックを介してメソッドをチェーンすることができます。 – alexsc

+0

ObservableまたはflatMapを使用すると、これを回避できます。 – pik4

+1

http://stackoverflow.com/documentation/rxjs/8247/common-recipes/28035/sending-multiple-sequential-http-requests#t=201703151245534460988またはhttp://stackoverflow.com/documentation/rxjsをご覧ください/ 8247/common-recipes/27973 /送付複数並列httpリクエスト#t = 201703151246046358239 – martin

答えて

0
あなたのログイン方法上で観察戻ってきている

、だから、あなたのデータ・サブスクリプションでは、ユーザー・サービスからgetMe()を呼び出してください。

これは、この問題に近づくためにはかなり鈍く刺激的な方法です。既に述べたように、mergeMapはここでうまくいきます。

この簡単な例を確認してください。 Observableデータで遊んで、何が起こっているのかを感じることをお勧めします。 Observable.ofは基本的にこの場合の偽のネットワーク要求のように動作します。

http://jsbin.com/pohisuliqo/edit?js,console

関連する問題