Правильный путь к rx js соблюдать с таймаутом - PullRequest
0 голосов
/ 28 января 2020

Мне нужно получить объект из 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));

1 Ответ

1 голос
/ 28 января 2020

Вы можете использовать timeoutWith() оператор:

objObserver
  .pipe(
    first(),
    timeoutWith(timeout, throwError(new Error('timeout'))),
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...