将回调从动作传递到 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))
);
我目前正在使用 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))
);