我正在使用 redux-observable 为 react-redux-firebase 侧项目实现自动保存。目前,我有一个 updateFretboardEpic,它响应任何修改当前拥有对 Firebase 数据库的引用 (firebaseKey) 的 Fretboard 组件的操作。1 秒去抖动后,updateFretboard 应该将组件的新状态保存到 Firebase。
import {
ADD_STRING,
REMOVE_STRING,
INC_STR_PITCH,
DEC_STR_PITCH,
ADD_FRET,
REMOVE_FRET,
UPDATE_FRETBOARD
} from '../actions/action-types';
import {
updateFretboard
} from '../actions/fretboard-actions';
export const updateFretboardEpic = (action$, store) => {
return action$.ofType(
ADD_STRING,
REMOVE_STRING,
INC_STR_PITCH,
DEC_STR_PITCH,
ADD_FRET,
REMOVE_FRET
)
.filter(() => store.getState().fretboard.firebaseKey !== undefined)
.debounceTime(1000)
.map(() => updateFretboard(
store.getState().fretboard.fretboardData,
store.getState().fretboard.firebaseKey
));
};
但是,我目前收到以下错误:
Uncaught Error: Actions must be plain objects. Use custom middleware for async actions.
at Object.performAction (<anonymous>:3:2312)
at liftAction (<anonymous>:2:27846)
at dispatch (<anonymous>:2:31884)
at bundle.ff2509b….js:9896
at SafeSubscriber.dispatch [as _next] (vendor.ff2509b….js:51341)
at SafeSubscriber.__tryOrUnsub (bundle.ff2509b….js:392)
at SafeSubscriber.next (bundle.ff2509b….js:339)
at Subscriber._next (bundle.ff2509b….js:279)
at Subscriber.next (bundle.ff2509b….js:243)
at SwitchMapSubscriber.notifyNext (bundle.ff2509b….js:6579)
在实现 redux-observable 之前,updateFretboard 使用 Redux-Thunk 来调度一个动作:
export function updateFretboard(fretboardData, firebaseKey = undefined) {
return dispatch => { fretboards.child(firebaseKey).update(fretboardData); };
}
将它与 redux-observable 一起使用将产生错误而没有任何自动保存。我没有返回一个 thunk,而是将其更改为:
export function updateFretboard(fretboardData, firebaseKey = undefined) {
return fretboards.child(firebaseKey).update(fretboardData);
}
有趣的是,updateFretboardEpic 将自动保存流中的第一个操作,返回错误,并且不会自动保存之后的任何后续操作。updateFretboard 目前不流经我的任何减速器(它只负责将新状态传递给 Firebase),尽管我将来可能会选择接收一个知道保存何时发生的承诺并将其传递给我的减速器。
我是 RxJS/redux-observable 的新手,所以我怀疑有更好的方法来做到这一点。想法?