2017-07-12 9 views
1

私は以下の問題があります: oAuthからトークンを取得するPOST要求を送信する必要があります。後で別のサービスを介してユーザーコンテキストを作成したいと考えています。しかし、私はObservableを保存する必要があります。コンポーネントの応答に反応したいからです。観測可能に作成し、それを購読して返します

これは適切な方法ですか?

login(username, password): Observable<any> { 
    let response$ = this._http.post(params) 
    .map((response: Response) => response.json()); 

    response$.subscribe(v => this._userService.doSmth()); 

    return response$; 
} 

EDIT:

私は@Maximus応答に基づいて、それを行うための別の方法を発見しました。それは正しい - 私はただ一つの要求をしたい。だから、私はこう書いた:

let response$ = this._http.post(data) 
    .map((response: Response) => response.json()); 

let user$ = new Subject<User>(); 

response$.subscribe(v => 
    this._userService.createNewSession(v) // returns observable 
    .subscribe(u => user$.next(u)) 
); 

return user$.asObservable(); 

これはいいですか?

+0

コンポーネントのレスポンスに反応するのが好きです._ - なぜですか?それで何をするつもりですか? –

+0

"user logged event"に反応するコンポーネントが必要です。 –

答えて

2

このコード:

let response$ = this._http.post(params).map((response: Response) => response.json()); 

自体は何もしません観測可能なチェーンを設定します。誰かがそれを購読するとすぐに、http要求を送信します。これは、ここに何が起こるかです:

response$.subscribe(v => this._userService.doSmth()); 

しかし、そのチェーンではなく、値が返されるまでresponse$ポイント。他の誰かがresponse$に再度購読すると、新しい要求が発行されます。

あなたはresponse$へのサブスクリプションを許可すると、システムの他の部分が値にアクセスできるようにしたい場合は、あなたがAsyncSubjectを使用する必要があります。

まだ私は私がなるので、観察可能な保持する必要がある_But
let subject = new AsyncSubject(); 
let response$ = this._http.post(data).map((response: Response) => response.json()).subscribe(subject); 
response$.subscribe(v => this._userService.createNewSession(v)); 

return response$; 
+0

@ŁukaszSzcześniak、今あなたの質問は何ですか? –

+0

申し訳ありません、私は尋ねることを忘れました。私はちょうど良い方法があるかどうかを知りたいのです。 –

+0

@ŁukaszSzcześniak、それは、私の更新された答えを参照してください –

関連する問題