基于规则的 redux 可观察史诗中的多个动作
Multiple actions in redux observable epic based on rules
我意识到我可以在 redux-observable
epic
中发出多个动作,并且看过一些示例,但我似乎无法正确处理。
基本上,我想要 return 三个相互不依赖的动作。但是,每个动作都将基于我必须使用我所在州的某些值做出的决定。所以,它是这样的:
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% 确定。
在这个简单的例子中,我本来可以轻松完成 if(state$.value.module1.value > 10)
但在我的应用程序中有些情况下,将这些值分配给局部变量对我来说更易读,因为我正在处理多个值。所以,如果能创建一个很好的代码块,我可以在其中清楚地布置我的业务逻辑,那就太好了。
我该如何处理?
您不必在 mergeMap
函数中使用箭头函数的 表达式 版本。您可以使用带有 body 和 return
语句的箭头函数来 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())
)
)
如果我真的需要在一个史诗中调度几个动作,我会做这样的事情。您可以 return 数组 [creator()]
或 []
而不是 of
和 empty
。为了避免无限循环,我吞下了初始动作。但是,考虑将其拆分为多个 epics.
我意识到我可以在 redux-observable
epic
中发出多个动作,并且看过一些示例,但我似乎无法正确处理。
基本上,我想要 return 三个相互不依赖的动作。但是,每个动作都将基于我必须使用我所在州的某些值做出的决定。所以,它是这样的:
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% 确定。
在这个简单的例子中,我本来可以轻松完成 if(state$.value.module1.value > 10)
但在我的应用程序中有些情况下,将这些值分配给局部变量对我来说更易读,因为我正在处理多个值。所以,如果能创建一个很好的代码块,我可以在其中清楚地布置我的业务逻辑,那就太好了。
我该如何处理?
您不必在 mergeMap
函数中使用箭头函数的 表达式 版本。您可以使用带有 body 和 return
语句的箭头函数来 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())
)
)
如果我真的需要在一个史诗中调度几个动作,我会做这样的事情。您可以 return 数组 [creator()]
或 []
而不是 of
和 empty
。为了避免无限循环,我吞下了初始动作。但是,考虑将其拆分为多个 epics.