基于规则的redux可观测epic中的多动作

基于规则的redux可观测epic中的多动作,redux,react-redux,rxjs,redux-observable,Redux,React Redux,Rxjs,Redux Observable,我意识到我可以在redux observableepic中发出多个动作,并且已经看到了一些示例,但在我的例子中,我似乎无法正确地执行这些动作 基本上,我想返回三个互不依赖的动作。然而,每一项行动都将基于我必须使用我所在州的某些值做出的决定。所以,是这样的: const doX = () => ({ type: types.DO_X }); const doY = () => ({ type: types.DO_Y }); const doZ = () => ({ type: t

我意识到我可以在
redux observable
epic
中发出多个动作,并且已经看到了一些示例,但在我的例子中,我似乎无法正确地执行这些动作

基本上,我想返回三个互不依赖的动作。然而,每一项行动都将基于我必须使用我所在州的某些值做出的决定。所以,是这样的:

const doX = () => ({ type: types.DO_X });
const doY = () => ({ type: types.DO_Y });
const doZ = () => ({ type: types.DO_Z });
const doA = () => ({ type: types.DO_A });
const doB = () => ({ type: types.DO_B });
const doC = () => ({ type: types.DO_C });

export const myEpic = (action$, state$) => action$.pipe (
   ofType(types.SOMETHING_HAS_HAPPENED)
   mergeMap(action => Observable.of(
      const value1 = state$.value.module1.value;
      if(value1 > 10) {
          doX();
      } else {
          doY();
      },
      // Second action
      const value2 = state$.value.module2.value;
      if(value2) {
         doA();
      } else {
         doB();
      },
      // Third action -- similar idea here
   )
);
这是一个业务逻辑块,它无法工作。另外,我想我应该在这种情况下使用
mergeMap
,但不是100%确定

在这个简单的例子中,如果(state$.value.module1.value>10),我可以轻松地完成
if(state$.value.module1.value>10)
,但在我的应用程序中,我更容易将这些值分配给局部变量,因为我处理的是多个值。因此,最好创建一个好的代码块,在这里我可以清楚地展示我的业务逻辑

如何处理此问题?

您不必在
mergeMap
函数中使用箭头函数的表达式版本。您可以使用带有主体的箭头函数和
return
语句来返回新的可观察对象:

mergeMap(action => {

    const actionsToEmit = [];

    const value1 = state$.value.module1.value;
    if (value1 > 10) {
      actionsToEmit.push(actionCreatorX());
    } else {
      actionsToEmit.push(actionCreatorY());
    }

    // Second action
    const value2 = state$.value.module2.value;
    if (value2) {
      actionsToEmit.push(actionCreatorA());
    } else {
      actionsToEmit.push(actionCreatorB());
    }

    return Observable.of(...actionsToEmit);
  }
)
所以这只是标准的程序代码

const epic = (action$, state$) =>
    action$.pipe(
           ofType(SOME_TYPE)
           mergeMap(val => empty().pipe(
              merge(state$.value.v1 ? of(creatorA()) : empty())
              merge(state$.value.v2 ? of(creatorB()) : empty())
              merge(state$.value.v3 ? of(creatorC()) : empty())
              )
           )

如果我真的需要在一部史诗中完成一些动作,我会这样做。您可以返回数组
[creator()]
[]
,而不是
空。为了避免无限循环,我吞下了初始动作。但是,考虑把它分成几个史诗。

这看起来很干净。但是,我无法导入/使用
。它是
未定义的
。根据这篇文章(),我通过使用'rxjs'中的
import{of}导入它在v6中。刚刚检查了我的
package.json
,我的版本是
6.2.2
。你知道这里有什么问题吗?显然,在
v6
中,我们只需要:
返回(…actionsToEmit)。这解决了问题。再次感谢你的帮助。非常感谢!