2016-11-18 49 views
1

我有一个简单的搜索方法与RXJS反跳更改方法没有得到服务错误后调用Angular 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; 
    } 

但是,如果有错误,例如,我将网址更改为错误的...此更改功能不再打。即使更改后的值

我认为如果出现错误,我需要杀死observable。但是完全不知道如何实现这一点。

回答

0

你的解释几乎是正确的。如果你让可观察到的错误没有捕捉到错误,它可能不再工作。你需要做的是使用catch操作符来捕获错误并处理失败而不杀死observable。

这可能是这样的:

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 –

相关问题