2017-05-09 18 views
10

Angular 2で終わるすべてのリクエストにローディングスピナーを追加しようとしています。そのため、HttpServiceというHttpサービスを拡張しました。すべてのリクエストの後、finallyスピンを止めることができるようにエラーをキャッチした後、finally()関数を呼びたいと思います。Angular 2のObservableを捕まえた後にfinally()が動作しないのはなぜですか?

しかしtypescriptです言う:

[TS]プロパティ 'ついに' タイプに '観察可能な' は存在しません。私はこのようなすべてのHTTP要求の後にいくつかのコードを実行するにはどうすればよい

import { AuthService } from './../../auth/auth.service'; 
import { Injectable } from '@angular/core'; 
import { Http, XHRBackend, RequestOptions, RequestOptionsArgs, Request, Response, Headers } from '@angular/http'; 

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/observable/throw'; 

@Injectable() 
export class HttpService extends Http { 

    constructor(
     backend: XHRBackend, 
     options: RequestOptions, 
     private authservice: AuthService 
    ) { 
     super(backend, options); 
     this.updateHeaders(options.headers); 
    } 

    request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { 
     return super.request(url, options) 
      .catch((response: Response) => this.authError(response)) 
      .finally(() => { 
       // ... 
       /* Do something here when request is done. For example 
       finish a spinning loader. */ 
      }); 
    } 

    private authError(response: Response) { 
     if (response.status === 401 || response.status === 403) { 
      this.authservice.logout(); 
     } 
     return Observable.throw(response); 
    } 

    private updateHeaders(headers: Headers) { 
     headers.set('Content-Type', 'application/json'); 
     if (this.authservice.isloggedIn()) { 
      headers.set('Authorization', `Bearer ${this.authservice.getToken()}`); 
     }   
    } 
} 

?それを行う最善の方法は何ですか?

+0

あなたは 'finally'をインポートする必要があります。それを説明する答えで十分な質問があるべきです。 –

答えて

25

あなたはそれをインポートするのを忘れ:

import 'rxjs/add/operator/finally'; 
+0

ありがとうございます。 「最終的には関数ではない」というエラーが表示され、このインポートを追加すると問題が解決されました。 –

+0

私のために働いた! – Sami

関連する問題