将回调从动作传递到 Epic

Passing callback from action into Epic

我目前正在使用 action creator 将回调函数传递给 Epic,但是我 运行 遇到了常见错误:Actions must be plain JavaScript objects...

有没有一种方法可以在执行回调的同时继续处理 Epic 中的可观察对象?我也尝试过使用花括号和显式 return 将链分配给变量,并在调用回调后 return 它,但我 运行 遇到了同样的问题。

代码:

const selectItem = (item, activeRow, cb) => ({ type: SELECT_ITEM, activeRow, item, cb });

const selectItemEpic = action$ =>
    action$.ofType(SELECT_ITEM)
    .mergeMap(action =>
        Observable.forkJoin(
            ajax.getJSON(...),
            ajax.getJSON(...)
        )
        .map(res => returnSelectedItem({ ...res[0].response, ...res[1].response }, action.activeRow))
        .map(() => action.cb()) // failing here
        .takeUntil(action$.ofType(SELECT_ITEM))
    );

map 运算符是一个 1:1 映射——所以它希望您在投影函数中 return 某些东西。现在您正在 return 计算 action.cb() 的结果。如果这不是一个动作(例如 return 什么都没有/undefined),那将是你的错误来源。

不是 100% 清楚 returnSelectedItems() return 是什么,如果这实际上是 return 您想要从史诗中发出的动作,您可以改用 do 运算符产生 action.cb() 副作用而不影响流经流的实际值。

const selectItemEpic = action$ =>
    action$.ofType(SELECT_ITEM)
    .mergeMap(action =>
        Observable.forkJoin(
            ajax.getJSON(...),
            ajax.getJSON(...)
        )
        .map(res => returnSelectedItem({ ...res[0].response, ...res[1].response }, action.activeRow))
        .do(() => action.cb()) // do, instead of map
        .takeUntil(action$.ofType(SELECT_ITEM))
    );