在史诗中,发出一个动作,当它完成时发出更多动作

问题描述

我希望 Action1(下面)的史诗作为可观察对象发出,Action3 然后在完成后发出 Action4 和 Action5。

library(terra)
rr <- lapply(ff,rast)
standard <- rr[[1]]

rs <- list(standard)
for (i in 2:length(rr)) {
    rs[[i]] <- resample(rr[[i]],standard,method='bilinear')
}

s <- rast(rs)

Action3 有史诗:

const action1Epic$ = (action$: Observable<IAction1>,state$: Observable<IState>) => 
    action$.pipe(
        withLatestFromState(state$),switchMap(([_action,{ stateProp }]) => {
            const somethingUninteresting$ = of(action2(stateProp));
            
            const compoundActions$ = of(action3(stateProp)).pipe(
                mergeMap(act =>
                    merge(...[of(action4(act.stateProp)),of(action5(act.stateProp))])
                )
            );
            return merge(somethingUninteresting$,compoundActions$);
        })
    );

结果是,我看到了“Action 3 is真正发生了!”的日志。但从来没有“API 调用正在发生!”。在调度程序中,我看到处理了 Action1、Action2、Action4 和 Action5,但从未处理过 Action3。

解决方法

您需要在合并参数中包含 act 本身。

const compoundActions$ = of(action3(stateProp)).pipe(
  mergeMap(act =>
    merge(...[of(act),of(action4(act.stateProp)),of(action5(act.stateProp))])
  )
);

action1 史诗中的 action3 实例 - act 回调中的 mergeMap - 永远不会作为 Redux 动作发出,因为它不是由史诗中返回的 observable 发出的(特别是 {{1 }}).

您确实订阅了一个发出该动作(compoundActions$ 位)的 observable,但您仅使用它来创建其他 2 个动作, 这是 of(action3(stateProp) 唯一发出的。


ps

不相关但希望有用:您可以简化创建 observable 的方式。

compoundActions$

可以简化为

merge(...[of(action4(act.stateProp)),of(action5(act.stateProp))]

就此而言 - 我不确定您是否只是在简化 SO 示例的现有代码 - 如果您需要做的就是按该顺序发出操作 3、4 和 5,您可以这样做:

from([action4(act.stateProp),action5(act.stateProp)])