首页 > 解决方案 > 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));

标签: javascriptrxjsobserver-patternobservers

解决方案


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

objObserver
  .pipe(
    first(),
    timeoutWith(timeout, throwError(new Error('timeout'))),
  )

推荐阅读