gpt4 book ai didi

javascript - 如何通过 `.publishReplay()` 在具有缓存的 RxJS Observable 上设置超时?

转载 作者:行者123 更新时间:2023-11-29 23:55:26 24 4
gpt4 key购买 nike

我创建了一个 Observable 来缓存它们的结果一段时间。这个例子很棒而且非常有用!!但是我无法为项目生产者设置超时。我试图在 mockDataFetch() 中使用超时运算符,但在第一个失败的项目之后,流无法恢复。如何实现带超时的mockDataFetch

这正是我所做的:

const Observable = Rx.Observable;

var counter = 1;
var updateRequest = Observable.defer(() => mockDataFetch())
.publishReplay(1, 1000)
.refCount();

function mockDataFetch() {
return Observable.of(counter++)
.delay(Math.floor((Math.random() * 100) + 1))
.timeout(50);
}

function mockHttpCache() {
return updateRequest
.take(1);
}

另一方面,如果在 mockDataFetch 中得到一个 Excpetion 会发生什么?我希望在下一个项目上(1000 毫秒后,如 publishReplay 方法中所定义),可观察对象会发出一个新项目。

最佳答案

我想我应该更新示例并添加这个用例,因为这是一种很常见的情况(无论如何,我很高兴你发现它有用!)。

当从 mockDataFetch() 返回的 Observable 发送错误/完成通知时,Subject 内部将其自身标记为已停止(参见解释 Rx.Subject loses events),因此它不会重新发送任何项目。理想情况下,您可以使用 mockDataFetch() 中的 catch() 运算符捕获所有错误:

function mockDataFetch() {
return Observable.of(counter++)
.delay(Math.floor((Math.random() * 100) + 1))
.timeout(50)
.catch(err => Observable.of('This request is broken.'));
}

查看现场演示:https://jsbin.com/jiguti/5/edit?js,console

此示例的输出可能如下所示:

Response 0: This request is broken.
Response 50: This request is broken.
Response 200: This request is broken.
Response 1200: 2
Response 1500: 2
Response 3500: This request is broken.

关于javascript - 如何通过 `.publishReplay()` 在具有缓存的 RxJS Observable 上设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41813865/

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