Наблюдаемый таймер: возврат действия после завершения таймера

#javascript #reactjs #react-redux #rxjs #observable

#javascript #reactjs #реагировать-redux #rxjs #наблюдаемый

Вопрос:

Я пытаюсь создать простой рабочий опрос с таймером из rxjs в приложении React.

Для этого я создал epic. Довольно просто — я получаю от сервера некоторую информацию каждые 5 секунд в течение 1 минуты.

 const processPollEpic = action$ => action$.pipe(
  ofType(POLL_START),
  mergeMap(() => timer(0, 5000).pipe(
    exhaustMap(() => from(service.getSmth()).pipe(map(resp => {
      if (resp.isSuccess) {
        return processPollStop();
      }
      return processPollContinue();
    }))),
    takeUntil(action$.ofType(POLL_STOP)),
    take(12),
  )),
);
  

Он работал нормально, но я не могу решить один угловой случай.
Теперь я возвращаю действие POLL_STOP только тогда, когда ответ от сервера будет успешным.
Но когда время истекло, я ничего не делаю.

Могу ли я вернуть какое-либо действие, когда таймер будет завершен?

Ответ №1:

Вы можете разделить внутреннюю цепочку внутри mergeMap :

 concat(
  timer(0, 5000).pipe(
    exhaustMap(() => from(service.getSmth()).pipe(map(resp => {
      if (resp.isSuccess) {
        return processPollStop();
      }
      return processPollContinue();
    }))),
    take(12),
  ),
  of(CREATE_OTHER_ACTION_HERE),
).pipe(
  takeUntil(action$.ofType(POLL_STOP)),
)
  

concat будет подписываться of() только после завершения предыдущей цепочки. Затем takeUntil все еще может завершить всю цепочку, поэтому concat он просто отпишется от своей внутренней наблюдаемой.

Кстати, убедитесь, что вы импортируете правильный concat from 'rxjs' , а не from 'rxjs/operators' .