我有一个Subject(this.searchSubject),当我想执行搜索时,我将其调用next():
this.searchSubject.next(postBody)
这会导致以下情况发生:
this.searchSubject
.switchMap((view: any) => {
// upsert here records the search - needed
return this.searchHistoryService.upsert(view)
.flatMap(() => this.http.post(this.url, view))
.map((data) => this.pageTransform(data));
})
.subscribe(res => {
this.successSubject.next(this.pageTransform(res));
}, err => {
this.errorSub.next(err);
});
不幸的是,无论我做什么,如果this.errorSub.next(错误),我似乎无法保持流存活.被调用(错误条件).
由于httpClient(this.http.post)返回一个新的observable,我不会想到处理错误将是一个问题,但它似乎从this.searchSubject中删除所有观察者.
注意我有一个httpInterceptor,它返回每个返回错误的抛出错误.
这一定是一个非常普遍的模式,所以我做错了什么?
解决方法:
您的错误处理程序位于外部switchMap投影中,因此它会在发生错误时关闭外部流.您必须将其移动到switchMap中以保持外部流的活动.
因为您使用的是[email protected],所以可以使用lettable运算符,这样可以更容易地查看错误处理程序的放置位置.
this.searchSubject.pipe(
switchMap((view: any) => {
return this.searchHistoryService.upsert(view)
.pipe(
flatMap(() => this.http.post(this.url, view)),
map((data) => this.pageTransform(data)),
catchError(() => {
this.errorSub.next(err);
})
);
})
).subscribe(() => {
this.successSubject.next(this.pageTransform(res));
});
如果切换到lettable运算符,一个重要的注意事项是你必须从’rxjs / operators’中的rxjs /运算符导入它们,例如import {map,catchError};
.
如果你继续使用旧的语法,我认为在你的.map()投影之后添加.catch会很容易.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。