CAK*_*AK2 3 rxjs switchmap angular9
我正在使用 Angular (9) 驱动的 Bootstrap (6.1.0) TypeAhead 并定义其搜索函数,如下所示:
search = (text$: Observable<string>) => {
return text$.pipe(
debounceTime(200),
distinctUntilChanged(),
// switchMap allows returning an observable rather than maps array
switchMap((searchText) => {
if (!searchText || searchText.trim().length == 0) {
// when the user erases the searchText
this.dealerRepUserID = 0;
this.dealerRepChanging.emit(this.dealerRepUserID);
return EMPTY;
}
else if (this.dealerID == this.hostOrganizationID) {
// get a list of host reps
return this.myService.getHostRepsAutoComplete(searchText, this.includeInactive);
} else {
// get a list of dealer reps
return this.myService.getDealerReps(this.dealerID, searchText);
}
})
);
}
Run Code Online (Sandbox Code Playgroud)
该函数必须返回一个 Observable。如何捕获 switchMap 中抛出的错误?
本身switchMap不会抛出任何错误,可能会做一些意想不到的事情是返回的可观察值this.myService.getHostRepsAutoComplete和this.myService.getDealerReps。捕获错误的一个棘手时刻是,每当有可error观察对象抛出错误时,就会被杀死。
例如
observable$.pipe(
switchMap(() => observable2$),
catchError(() => doSomethingFunction())
).subscribe()
Run Code Online (Sandbox Code Playgroud)
observable$一旦出现错误,就会完成,这将完成您的搜索流,并且在错误发生后您将不会获得更多数据。
正如 Phat Tran Ky 在他的示例中所示,错误处理应该发生在switchMap运算符的新流内
observable$.pipe(
switchMap(() => observable2$.pipe(catchError(() => doSomethingFunction())),
)
).subscribe()
Run Code Online (Sandbox Code Playgroud)
通过这样做,每当从内部抛出错误时,它都会杀死内部可观察量(observable2$),但不会杀死外部可观察量的外部订阅observable$
为了处理一个地方的错误,您可以做的进一步增强可能是将内部可观察值合并为一个,例如,类似
observable$.pipe(
switchMap(() => {
return merge(
observable1$.pipe(filter(() => ${your if else condition for case 1})),
observable2$.pipe(filter(() => ${your if else condition for case 2})),
observable3$.pipe(filter(() => ${your if else condition for case 3})),
).pipe(catchError((error) => yourErrorHandlerFunction(error)))
})),
)
).subscribe()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12239 次 |
| 最近记录: |