1

我目前正在使用动作创建器将回调函数传递给 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))
    );
4

1 回答 1

2

运算符的map意思是 1:1 映射——因此它希望您在投影函数中返回某些内容。现在,您正在返回结果action.cb()。如果这不是一个动作(例如,它什么都不返回/ undefined),那将是您的错误的根源。

不是 100% 清楚returnSelectedItems()返回什么,如果这实际上返回了您想要从史诗中发出的动作,您可以改为使用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))
    );
于 2017-05-15T23:52:10.703 回答