如何创建发出另一个史诗的史诗,同时只听一次它的结束,直到它失败?

How to create epic that emits another one and at the same time listens for its end only once and until it fails?

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

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 时,它将 运行 它的内容。 它还 returns 一个动作和一个侦听器(我们称之为 Sub-Epic)。 动作是 action-b 并且完成后,它将发出 action-c 或 action-e (失败案例) Sub-Epic 本身侦听 action-c 发生,我们只接受一次并接受直到收到 action-e 因为我们希望 action-d 只发生一次。

我们 运行 action-d 作为 action-a

重新 运行 的结果

到 运行 那...我们可以调用 dispatch({ type: 'action-a' });