将回调从动作传递到史诗

时间:2017-05-15 23:28:46

标签: javascript observable redux-observable

我目前正在使用动作创建器将回调函数传递给Epic,但我遇到了常见错误:Actions must be plain JavaScript objects...

有没有办法执行回调并继续使用Epic中的observable?我还尝试使用花括号和显式返回将链分配给变量并在调用回调后返回它,但我遇到了同样的问题。

代码:

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))
    );

1 个答案:

答案 0 :(得分:2)

map运算符意味着1:1映射 - 因此它希望您在投影函数中返回一些内容。现在你正在返回action.cb()的结果。如果这不是一个操作(例如,它不返回任何/ undefined),那将是您的错误的来源。

returnSelectedItems()返回的内容不是100%清楚,如果这实际上返回了您要从史诗中发出的动作,则可以使用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))
    );