gpt4 book ai didi

javascript - RxJS 中的 self 修复错误处理

转载 作者:行者123 更新时间:2023-11-30 14:25:47 25 4
gpt4 key购买 nike

我是 RxJS 的新手。

我有一个 promise 的基础 HTTP 客户端。它有一个 login() 方法,可以从服务器获取 token 并将其存储在内部以供其他方法使用。

当 token 过期时,服务器将响应 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 毫秒,它永远不会“发生” - 它会尝试一次又一次地调用电话。

我想你想要更多的东西:

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 可以返回 Promise 或 Observable,而 delay 用于延迟重试。

关于javascript - RxJS 中的 self 修复错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51951642/

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