rxjs观察超时的正确方法

问题描述 投票:0回答:1

我需要从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));
javascript rxjs observer-pattern observers
1个回答
0
投票

您可以使用timeoutWith()运算符:

timeoutWith()
© www.soinside.com 2019 - 2024. All rights reserved.