gpt4 book ai didi

javascript - Angular 2 服务出错后未调用更改方法

转载 作者:行者123 更新时间:2023-11-28 05:19:34 25 4
gpt4 key购买 nike

我有一个简单的搜索方法,使用 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 更改为错误的 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”开始的原始链不会中断并保持事件状态。

对于错误的答案,我深表歉意。

关于javascript - Angular 2 服务出错后未调用更改方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40668538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com