2016-12-07 6 views
2

ObservableをAngular 2で使用する場合、非同期ストリームを処理したいと考えています。 詳しくは、すべてのユーザーのリクエストの前に、有効であれば、ユーザーは適切な応答を得ることができます。したがって、以下のように実際のリクエストの前にhttpリクエストを行う必要があります。getServiceTicket()というメソッドを呼び出しますが、非同期ストリームのため、有効なサービスチケットを取得する前に、次のhttpリクエスト(getDetail)有効なサービスチケット。だから私はisServiceTicketのようなフラグを使用しようとしましたが、私はそれがこれらの2つのメソッドの連続実行を保証しないことを認識します。私はいくつかの研究を試みましたが、満足のいく答えを見つけることができませんでした。誰かがこれに対して良い解決策を持っているなら、いくつかの助言を与えることができますか?角度2の前回のリクエストの結果に基づいてHTTPリクエストを実行

getServiceTicket() { 
    this.userAuthServie.getServiceTicket().subscribe(
     (data: string) => {this.serviceTicket = data; this.isServiceTicket = true;} 
    ); 
} 

getDetail(id: string) { 
    this.getServiceTicket(); 
    return this.http.get('https://localhost/detail/' + id + '?ticket=' + this.serviceTicket) 
    .map((responseData) => { 
     return <User>responseData.json(); 
    } 
    ); 
} 
+0

たぶん、あなたはこのを探しています:https://coryrylan.com/blog/angular-multiple-http-requests-with-rxjs – Ploppy

答えて

0

あなたは以下のようなヨールのコードを変更することができます。

user:User; 

     getDetail(id: string) { 

     this.userAuthServie.getServiceTicket() 
      .subscribe((data: string) => { 
      this.serviceTicket = data; 
      this.isServiceTicket = true; 
      this.http.get('https://localhost/detail/' + id + '?ticket=' + this.serviceTicket) 
       .map((responseData) => { 
       this.user= <User>responseData.json(); 
       }); 
      }); 

     } 
+0

私はこの方法を行う場合、私は取得「プロパティを読み取ることができません「サブスクライブ'の未定義 "。 –

+0

UserAuthServiceのgetServiceTicketコードを提供してください。 –

+0

ありがとうございました。 UserAuthServiceのgetServiceTicketを次に示します。 getServiceTicket(){ cuser = JSON.parse(localStorage.getItem( 'cUser')); let creds = "servicename = http://xxx.xxx.xxx"; let headers = new Headers(); headers.append( 'Content-Type'、 'application/x-www-form-urlencoded'); if(cuser.token){ this.http.post( 'https:// localhost/serviceTicket /' + cuser.token + '?serviceName = http://xxx.xxx.xxx'、creds、ヘッダー:ヘッダー}) .map(res => res.json()) } } –

0

あなたが最初の関数の購読方法の成功の一部で実行したい第2の機能を配置することができます。

getServiceTicket() { 
    this.userAuthServie.getServiceTicket().subscribe(
     (data: string) => { 
      this.serviceTicket = data; this.isServiceTicket = true; 
      this.getDetail(id); 
     } 
    ); 
} 
+0

ありがとうございました。私はもう一つの質問があります。私がそのように実装したのは、サービスチケットが必要なときはいつでも、実際のhttpリクエストの前にそのメソッドを呼び出してサービスを取得したいということです。そのサービスチケットを実際のHTTPリクエストメソッドに渡します。このように実装すると、次のコードを繰り返す必要があります。 "this.userAuthServie.getServiceTicket()。subscribe(" so ... –

+0

これを行うには2つの方法があります。同じメソッド内でifステートメントを実行したり、参照している部分を実行したりすることもできます – Arash

0

「詳細要求」が実行される前にサービスチケットがロードされるのを待つ場合は、解決するためのサービスチケットの応答を待つ必要があります。複数の方法があります。詳細をキューに追加する方法と、サービスチケットが読み込まれるまでgetDetailsを待機させる方法があります。

getServiceTicket() { 
    // you need to return the observable from service ticket 
    return this.userAuthServie 
     .getServiceTicket() 
     // use map here to only intercept the value. 
     // remember that you need to subscribe somewhere else 
     // if called from elsewhere than getDetail 
     .map((data: string) => { 
      this.serviceTicket = data; 
      this.isServiceTicket = true; 
      return data; 
     }); 
} 

getDetail(id: string) { 
    return this.getServiceTicket() 
     // we switch the observable from ticket to the one from detail using switchMap 
     .switchMap((data: string) => { 
      let url = 'https://localhost/detail/' + id + '?ticket=' + this.serviceTicket; 
      return this.http 
       .get(url) 
       .map((responseData) => { 
        return <User>responseData.json(); 
       }); 
     }); 
    } 
} 
+0

大変ありがとうございますが、このプロパティのswitchMapは型 'Observable 'には存在しません。手がかりがある場合は、これについていくつか説明してください。 –

+0

非常にうまく動作しますか?よくありがとう! –

+0

switchMapの問題は何ですか? – Patrick

関連する問題