2016-11-18 25 views
1

私はRXJSデバウンスを使用した簡単な検索方法を持っていますサービスでエラーが発生した後に変更メソッドが呼び出されない角度2

このようにします。

this.searchTerm.valueChanges 
     .debounceTime(this._debounceDelay, this._scheduler) 
     .distinctUntilChanged() 
     .filter(this.filterForBlank.bind(this)) 
     .filter(this.filterForLength.bind(this)) 
     .switchMap(term => this.searchService.serchBy(term)) 
     .subscribe((data) => { 
     // do something 
     }, (err) => { 
      // show error on UI 
     }); 




private filterForLength(term: string) { 
    return (term.trim().length > 2); 
    } 

    private filterForBlank(term: string) { 
    if (isEmpty(term)) { 
       return false; 
    } 
    return true; 
    } 

などですが、エラーがある場合、たとえば、URLを間違ったものに変更しました。この変更機能は再びヒットしません。値を変更しても

私はエラーがある場合、私は観察可能なものを殺す必要があると思う。しかし、これを達成する方法はまったくありません。

答えて

0

あなたの説明はほぼ正しいです。エラーをキャッチせずに観察可能なエラーをさせてしまうと、もう動作しなくなる可能性があります。あなたがしなければならないことは、キャッチ演算子を使用してエラーを捕捉し、それを処理してオブザーバブルを「殺す」ことなく失敗させることです。

これは次のようになります。あなたは、バックエンドの呼び出しが失敗したなら今

this.searchTerm.valueChanges 
    .debounceTime(this._debounceDelay, this._scheduler) 
    .distinctUntilChanged() 
    .filter(this.filterForBlank.bind(this)) 
    .filter(this.filterForLength.bind(this)) 
    .switchMap(term => this.searchService.serchBy(term)) 
    .catch(errors => { 
    return Rx.Observable.empty(); 
    }); 
    .subscribe((data) => { 
    // do something 
    }); 

、それは優雅にcatch節によって処理され、新しい空の値を返します。この空の値を使用して、成功したときに表示しているデータをすべて消去することができます。それが動作すれば、catch節をスキップします。

編集: 正しいですか。これは動作しません。事実により、観察可能なチェーンエラーが発生すると、チェーン全体が壊れてしまいます。それを修正するには、これを実行する必要があります。

this.searchTerm.valueChanges 
    .debounceTime(this._debounceDelay, this._scheduler) 
    .distinctUntilChanged() 
    .filter(this.filterForBlank.bind(this)) 
    .filter(this.filterForLength.bind(this)) 
    .switchMap(term => 
       this.searchService.serchBy(term) 
        .catch(errors => { 
          // show error on ui 
          return Rx.Observable.empty() 
        })) 
    .subscribe((data) => { 
    // do something 
    }); 

switchMap内部のcatch文を移動することで、それが破壊されることswitchMap内部に観察チェーンになります。しかし、 'this.searchTerm.valueChanges'から始まるオリジナルのチェーンは壊れず、生きています。

私は間違った答えをお詫び申し上げます。

+0

それはキャッチするつもりですが、値の変更後にAPIを呼び出さない –

関連する問題