RxJS 中的自我修复错误处理
Self healing error handling in RxJS
我是 RxJS 新手。
我有一个承诺的基础 HTTP 客户端。它有一个 login() 方法,可以从服务器获取令牌并将其存储在内部以供其他方法使用。
当令牌过期时,服务器将响应 401 HTTP 错误,在这种情况下,我想再次调用 login() 并且重试请求。另外,重试其他类型的错误。
我不确定如何在 RxJS 中对其进行建模,我有一些工作,但我希望有更好的方法来做到这一点。
(这是一个装饰器,它应用于所有需要方法的身份验证,这里是wrappedFunc)
return interval(100)
.pipe(
startWith(0),
switchMap(() => {
return wrappedFunc.apply(this, args)
}),
retryWhen(errors$ => errors$.pipe(
switchMap((error) => {
if (error.response.status === 401) {
return this.login()
} else {
return of(error)
}
}),
scan((attempts, currentError) => {
if (attempts > 5) {
throw currentError
}
return attempts + 1
}, 0),
)),
first()
)
在 RxJS 中进行这种错误处理的惯用方法是什么?
interval(100)
每 100 毫秒发出一次,switchMap
将取消正在进行的订阅并重新订阅,因此如果 wrappedFunc
调用花费的时间超过 100 毫秒,它永远不会 "happen" - 它会尝试一次又一次地拨打电话。
我想你想要更多的东西:
return defer(() => wrappedFunc.apply(this, args))
.pipe(
retryWhen(errors$ => errors$.pipe(
switchMap((error) => {
if (error.response.status === 401) {
return this.login()
} else {
return of(error)
}
}),
scan((attempts, currentError) => {
if (attempts > 5) {
throw currentError
}
return attempts + 1
}, 0),
delay(100),
))
);
这里的 defer
作为包装器,因此 wrappedFunc
可以 return Promise 或 Observable,delay
用于延迟重试。
我是 RxJS 新手。
我有一个承诺的基础 HTTP 客户端。它有一个 login() 方法,可以从服务器获取令牌并将其存储在内部以供其他方法使用。
当令牌过期时,服务器将响应 401 HTTP 错误,在这种情况下,我想再次调用 login() 并且重试请求。另外,重试其他类型的错误。
我不确定如何在 RxJS 中对其进行建模,我有一些工作,但我希望有更好的方法来做到这一点。
(这是一个装饰器,它应用于所有需要方法的身份验证,这里是wrappedFunc)
return interval(100)
.pipe(
startWith(0),
switchMap(() => {
return wrappedFunc.apply(this, args)
}),
retryWhen(errors$ => errors$.pipe(
switchMap((error) => {
if (error.response.status === 401) {
return this.login()
} else {
return of(error)
}
}),
scan((attempts, currentError) => {
if (attempts > 5) {
throw currentError
}
return attempts + 1
}, 0),
)),
first()
)
在 RxJS 中进行这种错误处理的惯用方法是什么?
interval(100)
每 100 毫秒发出一次,switchMap
将取消正在进行的订阅并重新订阅,因此如果 wrappedFunc
调用花费的时间超过 100 毫秒,它永远不会 "happen" - 它会尝试一次又一次地拨打电话。
我想你想要更多的东西:
return defer(() => wrappedFunc.apply(this, args))
.pipe(
retryWhen(errors$ => errors$.pipe(
switchMap((error) => {
if (error.response.status === 401) {
return this.login()
} else {
return of(error)
}
}),
scan((attempts, currentError) => {
if (attempts > 5) {
throw currentError
}
return attempts + 1
}, 0),
delay(100),
))
);
这里的 defer
作为包装器,因此 wrappedFunc
可以 return Promise 或 Observable,delay
用于延迟重试。