Javascript 服务2出错后未调用更改方法
我有一个使用RXJS debounce的简单搜索方法 像这样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
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