RxJs 在错误时调用 observable 并重复步骤
Posted
技术标签:
【中文标题】RxJs 在错误时调用 observable 并重复步骤【英文标题】:RxJs call observable on error and repeat steps 【发布时间】:2019-08-19 14:11:04 【问题描述】:我有一个提交表单 submit$
的 observable。这个 observable 最终可能会出现状态码为403
的错误,这意味着用户未经授权,必须先登录。
有没有一种方法可以让我在特定的错误代码上调用另一个执行授权过程的 observable。授权成功后,我想重复submit$
,而无需用户再次调用该可观察对象。
为了说明我想要的步骤:
-
用户尝试提交,
submit$
正在被订阅
这会导致错误,状态码为403
Observable 调用另一个具有自己工作流的 authorise$
observable
当authorise$
成功时,再次调用submit$
过程以成功或错误完成
如果在authorise$
过程中出现错误,则中止submit$
进程
【问题讨论】:
你试过使用 retryWhen() 吗? 这听起来像是一个拦截器的工作,特别是如果你有一个用户需要登录才能“做事”的应用程序,所以拦截器会在一个地方捕获所有 403 错误并重试待处理成功登录后的请求。 【参考方案1】:我在这里尝试了一种方法,将它们分成两个可观察对象,submit$ 和 authenticationSubmit$,然后我再次合并它们。我没有测试过,我写了两次http.post(...),所以和你描述的不完全一样。
import merge from 'rxjs';
import filter, switchMap from 'rxjs/operators';
...
const submit$ = http.post(...);
const authenticationAndSubmit$ = submit$.pipe(
filter(httpResponse => httpResponse.status === 403),
switchMap(() => authService.login()),
filter(authResult => authResult === 'success'),
switchMap(() => http.post(...))
);
merge(submit$, authenticationAndSubmit$)
.pipe(
filter(httpResponse => httpResponse.status === 200),
)
.subscribe(httpResponse =>
// Do something
);
【讨论】:
以上是关于RxJs 在错误时调用 observable 并重复步骤的主要内容,如果未能解决你的问题,请参考以下文章
从角度 4 中的“rxjs/Observable”导入 Observable 时出错
Observable 错误,执行不同的 observable,重试原始 observable (Angular, RxJs6)
Angular2 RxJS 得到“Observable_1.Observable.fromEvent 不是函数”错误