Можно ли запустить/остановить/возобновить эпопею, наблюдаемую с помощью редукции, с помощью действий?

Этот вопрос может касаться redux-observable или rxjs, или обоих.

Я ищу способ начать, остановить или возобновить эпопею с помощью определенных действий. Например, эпик (который уже является частью промежуточного программного обеспечения эпика) будет активен, когда будет получено действие {type: 'START'}, но будет неактивен, когда будет получено действие {type: 'END'}. Это возможно?


person Huy Nguyen    schedule 06.08.2017    source источник


Ответы (1)


Для этого вы можете использовать комбинацию switchMap и filter (при условии, что все действия, включая начальные/конечные действия, исходят из одного и того же источника)

Если вы запускаете/завершаете действия из отдельного источника, это еще проще, тогда вы можете пропустить шаг разделения исходного потока.

Запустите приведенный ниже пример кода, чтобы увидеть его в действии.

// this would be your source
const actions$ = new Rx.Subject();

// in this example controllActions and dataActions are derived from the same stream,
// if you have the chance to use 2 seperate channels from the start, do that
const controllActions$ = actions$
  .filter(action => action.type === "END" || action.type === "START");
const dataActions$ = actions$
  .filter(action => action.type !== "END" && action.type !== "START");

const epic$ = controllActions$
  .switchMap(action => {
    if (action.type === "END") {
      console.info("Pausing stream");
      return Rx.Observable.never();
    } else {
      console.info("Starting/Resuming stream");
      return dataActions$;
    }
  });
epic$.subscribe(console.log);

// simulating some action emissions, the code below is _not_ relevant for the actual implementation
Rx.Observable.from([
  "Some data, that will not be emitted...",
  {type: "START"},
  "Some data, that _will_ be emitted...",
  "Some more data, that _will_ be emitted...",
  {type: "END"},
  "Some data, that will not be emitted...",
  "Some data, that will not be emitted...",
  {type: "START"},
  "Some data, that _will_ be emitted...",
  "Some more data, that _will_ be emitted..."
])
  .concatMap(d => Rx.Observable.of(d).delay(400))
  .subscribe(actions$);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

person olsn    schedule 06.08.2017