2016-04-26 9 views
7

私は、サーバーがcatch部分が呼び出されるの4xxで応答した場合、API角度2. Observableでリダイレクトを使用して4xxエラーを処理する方法は?

getItems(itemId: number): Observable<any> { 
    return this.http.get(url, headers) 
     .map(this.extractDataSingle) 
     .catch(this.handleError) 
} 

を呼び出してサービスを提供しています。 私のhandleErrorメソッドです。

private handleError = (error: any) => { 
    //Here I want to redirect to login. 
} 

loginページにリダイレクトします。 Observableを返さなければならないので、単にthis._router.navigate(['Login']);と入力しても機能しません。 Cannot read property 'subscribe' of undefinedという購読者にエラーが発生するため、空のObservable return Observable.empty;を返すこともできません。

ユーザーをログインページにリダイレクトする方法を教えてください。もちろん、私はエラーをキャッチし、私の加入者を介してリダイレクトするように私の加入者を変更することができます。しかし、私は私のサービスのエラーを処理する方が良いと思います。

また、私は4xxエラーを処理する方法の全く異なるソリューションを公開しています。

編集: @GüntherZöschbauerに感謝します。 return Observable.of([]);は私が必要としていたものです。 ただし、thisに注意してください。 .catch(this.handleError.bind(this))

getItems(itemId: number): Observable<any> { 
    return this.http.get(url, headers) 
     .map(this.extractDataSingle) 
     .catch(this.handleError.bind(this)) 
} 

handleError方法の使用bind(this)routerへのアクセス権を持つためにそうしないと、あなたのrouterにアクセスすることはできません。

+0

'empty'は関数であり、あなたが実際に実際に観察を得るためにそれを呼び出す必要があります:'(Observable.emptyを返す); ' – Brandon

+1

あなたがすることもできます.catch((err)=> this.handleError(err)) ' –

+0

私は矢印関数がバインドに比べて' this'を使うことができるはるかにクリーンな方法であることを発見しました。 – Joao

答えて

6

私はこれが何をしたいん推測:

private handleError = (error: any) => { 
    this._router.navigate(['Login']); 
    return Observable.of([]); 
} 
+0

私はちょうどこれをやっていて、私は 'Observable.empty()を返してみましたが、'未定義のsubscribe 'というプロパティを読み込めません。私はこれが破壊されているコンポーネントと関係があるかどうかわからない??? – Joao

+0

@Joaoこれは関連するとは思われません。私はあなたが試したことを示すコードで新しい質問を作成する方が良いと思います。 –

+0

ありがとうございます。 posted at http://stackoverflow.com/questions/37213494/angular-2-redirect-in-http-rxjs-catch-callback-causes-typeerror-cannot-read-pro – Joao

関連する問題