Javascript 服务2出错后未调用更改方法

Javascript 服务2出错后未调用更改方法,javascript,angular,debouncing,Javascript,Angular,Debouncing,我有一个使用RXJS debounce的简单搜索方法 像这样 this.searchTerm.valueChanges .debounceTime(this._debounceDelay, this._scheduler) .distinctUntilChanged() .filter(this.filterForBlank.bind(this)) .filter(this.filterForLength.bind(this)) .sw

我有一个使用RXJS debounce的简单搜索方法

像这样

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改错了。。。此更改功能不再运行。即使更改了值


如果有错误,我想我需要杀死observable。但我不知道如何做到这一点。

你的解释几乎是正确的。如果你让可观察到的错误,而没有捕捉到错误,它可能不会再工作了。您需要做的是使用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 => {
     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
  });
通过将catch语句移动到switchMap中,将打破该switchMap中的可观察链。但是,从“this.searchTerm.valueChanges”开始的原始链不会断开并保持活动状态


很抱歉回答错了。

你的解释几乎是对的。如果你让可观察到的错误,而没有捕捉到错误,它可能不会再工作了。您需要做的是使用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 => {
     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
  });
通过将catch语句移动到switchMap中,将打破该switchMap中的可观察链。但是,从“this.searchTerm.valueChanges”开始的原始链不会断开并保持活动状态


很抱歉回答错误。

不起作用!!它将捕获,但在值再次更改后,它不会调用APInot working!!它将捕获,但在值再次更改后,它不会调用API