2016-11-22 53 views
0

私は自分のObservableサービスを作成して、プレーヤーの現在のトラックを返すようにしました。角2観測可能なエラー処理

私は私の角度成分にこのサービスにこの方法をサブスクライブしている:あなたが見ることができるように、私はエラーを持っているとき

this.playerSubscription = this.player 
     .player(playlist) 
     .subscribe(
     playerInfo => this.playerInfo = playerInfo, 
     error => this.router.navigate(['login'], { queryParams: { error: 'expired_token' }}) 
    ); 

は、私は、ログインページにユーザーをリダイレクトします。

問題は以前のエラーの後にログインしたときにサブスクリプションが私にの最新のエラーシーケンスを返し、再びログインページにリダイレクトされることです。

私のサービスでは、BehaviorSubjectを使用して、有効なシーケンスにsubject.next(message)を実行していて、エラーシーケンスを送信するのにsubject.error(error)を実行しています。

を私の観測対象に再登録した後の最後のエラーを忘れることはできますか?

ありがとうございました!

UPDATE 1:

私はここにいくつかの新しいテストを行なったし、私は新しい件名に私が購読するたびに作成するときにのみ、怒鳴るように、動作します:

player(playlist: IPlaylist, fromBegin: boolean): Observable<IPlayerInfo> { 

    this._player = new BehaviorSubject<IPlayerInfo>({ status: PlayerStatuses.LOADING }); 

    ... more code here ... 

    return this._player.asObservable(); 
    } 

ネヴァーマインドをそれはSubjectかだ場合a BehaviorSubject

これは良い方法ですか?

+0

subject.errorコールの直前にプレーヤメソッドロジック内にログインするか、プレイヤールートの認証ガードを使用するようにリダイレクトします。 –

+0

サービス内にルータを追加することはお勧めできません。私はログインページのためにユーザーをリダイレクトするのはサービス責任だとは思わない。 –

答えて

0

私の観測対象に再登録した後の最後のエラーを忘れることはできますか?

BehaviorSubjectの代わりにSubjectを使用してください。

var subject = new Rx.Subject(); 

BehaviorSubjectcurrent valueを覚えてSubject変種の一つです。したがって、subscribeのたびに最新の値を取得したくない場合は、Subjectを使用してください。

+0

残念ながら、うまくいきませんでした。最後のエラーでログインした後もリダイレクトされ続けます。 –

+0

こんにちは@Michael、私はちょうど私の質問を更新します。いくつかのテストをしましたが、購読するたびに新しい件名を作成すると機能します。何かご意見は? –

関連する問題