rxjs 超时观察的正确方法
Correct way to rxjs observe with timeout
我需要从 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'))),
)
我需要从 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'))),
)