gpt4 book ai didi

javascript - 不要使用publishReplay缓存错误

转载 作者:行者123 更新时间:2023-12-01 03:38:39 25 4
gpt4 key购买 nike

我有一些 Javascript 代码:

public browse = (): Observable<IAttribute[]> => {
if (!this.attributes) {
this.attributes = Observable
.defer(() => this.http.browse())
// cache 1min
.publishReplay(1, 60000)
.refCount()
.take(1);
}
return this.attributes;
}

我遇到的一个问题是错误似乎被缓存了。具体情况是用户的 session 超时,因此端点返回 401,因此用户被重定向到登录页面 - 但因为它是在上一个请求尝试转到属性页面的 1 分钟内,所以会重新抛出401 而不是使请求新鲜。

有没有办法进行设置,以便在出现错误时重试,但仅在请求缓存版本时重试?即我不希望返回 401 的原始请求重试,但第二个请求应该重试该请求。

最佳答案

所以您仍然需要在原始订阅者中获取错误,对吧?

这不是那么漂亮,也许有人可以做得更好。这可能是 RxFiddle 最糟糕的演示(有一些关于主题的错误),但我仍然分享它......

开始吧,view this on RxFiddle:

let tries = 0
let httpMock = new Rx.Observable(o => {
if (tries == 0) {
setTimeout(() => o.error(new Error()), 10)
} else {
setTimeout(() => o.next("value"), 10)
}
tries++
})

let replaySubject = null
function browse() {
return Rx.Observable
.defer(() => httpMock)
.do(false, (e) => replaySubject = null)
.multicast(() =>
replaySubject || (replaySubject = new Rx.ReplaySubject(1)),
cache => cache.take(1)
)
.let(obs => replaySubject ? replaySubject : obs)
}

browse().subscribe(console.log, console.warn)

setTimeout(() => {
browse().subscribe(console.log, console.warn)
}, 1000)

关于javascript - 不要使用publishReplay缓存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44060117/

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