javascript - rxjs 观察超时的正确方法
问题描述
我需要从 ReplaySubject 获取一个对象,如果 5 秒内没有对象发生,应该抛出一个错误。
在下面做一些代码(它正在工作),但我愿意找到更优雅的解决方案。
const replaySubject = new ReplaySubject(1);
function objGet() {
return replaySubject;
}
function objGetWithTimeout() {
const timeout = 5000;
let observed = false;
const objObserver = objGet();
objObserver
.pipe(first())
.subscribe(() => observed = true);
return race(
objObserver,
timer(timeout)
.pipe(map(() => {
if (!observed) {
throw new Error('timeout');
}
})
)
)
}
以这种方式调用的函数:
objGetWithTimeout()
.pipe(catchError((err) => console.error('timeout') && throwError(err)))
.subscribe((data) => console.log('obj received', data));
解决方案
您可以使用timeoutWith()
运算符:
objObserver
.pipe(
first(),
timeoutWith(timeout, throwError(new Error('timeout'))),
)
推荐阅读
- oracle - ORACLE database - substr text from field without constant endpoint
- docker - Docker:来自守护进程的错误响应:删除 myvol:卷正在使用中
- java - ClientHandlerException 使用最新的(2.10.0 到 3.1.0)Java DocuSignAPI
- c - 从文件读取输入时如何限制scanf
- android - 我如何阻止任何安卓应用程序访问我的网站?
- flutter - getter 'bloc' 调用 null
- android - 如何将卡片视图相互重叠?
- reactjs - 未处理的拒绝(TypeError):无法读取未定义的属性“0”
- c# - 在列表框之间拖放
- java - 503 使用 Finish Upload 方法在 SharePoint Online 上上传文件时服务不可用