2016-11-23 8 views
0

AuthHttpサービス(angular2-jwt)のための 'インターセプター'を作成しようとしています。私はAuthHttpを拡張し、代わりにそれを使用するクラスを作成しました。これまでのところうまくいくようです。私が今したいのは、サーバーが401コードで応答した場合、アプリケーション内でログアウトを強制し、次のサブスクリプションを無視することです(これらのサブスクリプションが順次実行されるかどうかはわかりません。私は頼むつもりです)。Angular 2で観測可能なサブスクリプションシーケンスを中止します。

このシナリオでエラーを表示するには、このサブスクリプションからキューを中止し、それ以上のサブスクリプションを無視するだけです。ここでgetメソッドのコードは次のとおりです。

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    let observable = super.get(url, options); 
    observable.subscribe(
     () => { }, 
     (error: Response) => { 
      if (error.status === 401) { 
       // Logout and ignore all other subscriptions 
      } 
     } 
    ); 

    return observable; 
} 

これは可能ですか?

ありがとうございます!

答えて

1

unsubscribeです。 subscribeメソッドは、Subscriptionオブジェクトを返します。あなたはそれを使用して購読を停止することができます:

get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
    let observable = super.get(url, options); 
    let subscription = observable.subscribe(
     () => { }, 
     (error: Response) => { 
      if (error.status === 401) { 
       // Logout and ignore all other subscriptions 
       subscription.unsubscribe(); 
      } 
     } 
    ); 

    return observable; 
} 
+0

私はこれで何を達成するのか分かりません。テストとして私はあなたのコードを貼り付け、 'unsubscribe'とconsole.logを入れました。別のサブスクライブ(.get()を使って残りのAPIを呼び出し、observableにサブスクライブするサービスで)別の文字列で別のconsole.logを書きました。どちらもコンソールに印刷されています。私が避けたいのは、このオブザーバブルの他のエラーハンドラが実行されないということです。 –

+0

私はあなたの質問を理解しているか分からない。問題を少し詳しく説明してください。 – yarons

+0

私は、REST APIに対するログインを必要とするAPPをセットアップしました。ログインすると、アプリケーションに保存されたjwtトークンが発行され、(AuthHttpを使用して)すべての保護されたAPI呼び出しを検証するために使用されます。データを取得するときには、私は投稿を使用するか、電話をかけて購読してそれを取得するか、エラーを表示します(接続できなかったなど)。サーバーが呼び出しを検証できない場合は、401を返します。すべての認証された呼び出しをチェックする関数を(インターセプターとして)追加し、サーバーが401を返してログアウトし、他のすべてのエラーチェックをスキップする場合は、可能であれば購読しています。 –

関連する問題