- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 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 最糟糕的演示(有一些关于主题的错误),但我仍然分享它......
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/
我正在做一个 Angular 项目,但我不完全理解为什么这段代码没有按预期工作: const httpObs = Rx.Observable.of("") .do(() => console.lo
我已经知道了 publish 共享一个订阅并返回一个 ConnectableObservable(因此我们必须 Connect()) Share() 是 publish().refcount() Re
我正在 Angular 应用程序中实现缓存 HTTP 结果。据我所知,以下两个代码都有效,但我需要知道它们是否在做完全相同的事情,还是我遗漏了一些重要的东西? 最后发布 getPosts() {
我创建了一个 Observable 来缓存它们的结果一段时间。这个例子很棒而且非常有用!!但是我无法为项目生产者设置超时。我试图在 mockDataFetch() 中使用超时运算符,但在第一个失败的项
为什么 publishReplay(1).refCount() 不为迟到的订阅者重播最后一个值? a = new Rx.Subject(); b = a.publishReplay(1).refCou
我的用例是这样的:我使用 websocket 连接到服务,并从服务中获取定期(但不可预测)的健康数据。该应用程序可能有此数据流的多个用户,因此我想共享它。新订阅者应该看到最近发布的健康数据。当没有更多
我是一名优秀的程序员,十分优秀!