如何创建发出另一首并同时只听一次其结尾直到失败的史诗?

时间:2019-07-08 15:01:48

标签: reactjs redux rxjs redux-observable

我需要创建Epic A,它将发出Action B,从而启动Epic B,它将执行一些异步操作并最终发出Action C,同时Epic A设置Action C的侦听器并当接收到它时,它将发出动作D,从而完成监听动作C,直到再次被调用。 另外...如果Epic B返回动作E(失败案例),则Epic A也完成了对动作C的监听。

1 个答案:

答案 0 :(得分:0)

import { mergeMap, map, take, takeUntil, withLatestFrom } from 'rxjs/operators';
import { merge, of } from 'rxjs';
import { ofType } from 'redux-observable';

const smth = ($action, $state) =>
  $action.pipe(
    ofType('action-a'),
    withLatestFrom($state),
    mergeMap(([action, state]) => {
      const someData = someSelector(state);

      return merge(
        of({ type: 'action-b', someData }),
        $action.pipe(
          ofType('action-c'),
          map(() => {
            return {
              type: 'action-d',
            };
          }),
          take(1),
          takeUntil($action.pipe(ofType('action-e')))
        )
      );
    })
  );

export default smth;

在上面的代码中,我们实例化了epic,它将在收到action-a时运行其内容。 它还返回一个动作和一个侦听器(我们称其为Sub-Epic)。 操作为action-b,完成后将发出action-c或action-e(失败情况) Sub-Epic本身会监听action-c的发生,我们只接受一次,直到收到action-e为止,因为我们希望action-d仅发生一次。

我们运行action-d是由于重新运行action-a

要运行该代码...我们可以致电dispatch({ type: 'action-a' });