redux-observableを使用して、react-redux-firebase側プロジェクトの自動保存を実装しています。現在、私はfirebaseデータベースへの参照(firebaseKey)を持っているFretboardコンポーネントを変更するアクションに応答するupdateFretboardEpicを持っています。 1秒間のデバウンス後、updateFretboardはコンポーネントの新しい状態をFirebaseに保存する必要があります。Redux-Observableを使用したReact-Redux-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
));
};
しかし、私は現在、次のエラー取得しています:使用
export function updateFretboard(fretboardData, firebaseKey = undefined) {
return dispatch => { fretboards.child(firebaseKey).update(fretboardData); };
}
:
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の-観測可能な実装には、updateFretboardは、アクションをディスパッチするReduxの-サンクを使用していましたそれはredux-observableと一緒に立つので、自動保存なしでエラーが生成されます。代わりにサンクを返すので、私はこれにそれを変更:
export function updateFretboard(fretboardData, firebaseKey = undefined) {
return fretboards.child(firebaseKey).update(fretboardData);
}
興味深いことに、updateFretboardEpicは、ストリームの最初のアクションのために自動保存エラーを返し、その後、任意の後続のアクションのために自動保存されませんでしょう。 updateFretboardは現在のところ、自分のレデューサー(Firebaseに新しい状態を渡す責任があります)を経由していませんが、将来、保存がいつ発生したのかを知り、レデューサーに渡すという約束を受けることを選択できます。
私はRxJS/redux-observableを初めて使用しているので、これを実行するより良い方法があると思われます。思考?
応答ありがとうございました。 fretboards.child(firebaseKey).update(fretboardData)が返すものについて明示していないことをお詫びします。それは約束を返すので、私はそれをオブザーバブルに変え、自動アクションの成功を示すブール値で新しいアクションにマッピングしました。あなたのソリューションもうまくいきましたが、あなたが言及したように成功イベントを出すことはないでしょう。それが私が約束したルートに行った理由です。 –