Здравствуйте и заранее спасибо :)
Основная идея
Я хочу запускать определенные эпики action$ из redux-observable в зависимости от маршрута и отменять их при изменении маршрута. Также я хочу провести некоторую очистку, когда эпики отменяются. Я сделал это. Но:
Проблема
Я использую state.dispatch(actions.signInError({}))
для очистки (это устарело) и не знаю, как сделать это по-другому. Мой код ниже, проблема в самом конце.
Изменить эпики при изменении маршрута
/**
* Launch route specific actions if such exist and cancel previous one
*
* @param {Function} action$ - redux-observable action$
* @param {Object} state - redux state
*/
const addEpicsForRoute = (action$, state) => action$
.ofType(LOCATION_CHANGE) // action from route
.switchMap(
( action ) => {
// get epics for route
const epicsForRoute = routeEpics[ action.payload.pathname ];
if ( epicsForRoute ) {
return merge(
...epicsForRoute.map(observableCreator => observableCreator(action$, state))
);
} else {
return empty(); // no specific epics
}
}
);
Какая-то конкретная эпопея для какого-то маршрута
/**
* Handle xhr request-response/error logic of sign in user
*
* @param {Function} action$
* @param {Object} state
*/
export const signIn = ( action$, state ) => {
return action$
.ofType(types.SIGN_IN_REQUEST)
.mergeMap(( { params, } ) => (
Observable.create(observer => {
services
.signInRequest( // it is ajax observable
mappers.mapSignInRequest(params)
)
.map(response => actions.signInJWTSuccess( // dispatch success
mappers.mapUser(response)
))
.catch(error => of(actions.signInError( // dispatch error
mappers.mapSignInError(error)
)))
.subscribe(( value ) => { // pass action to redux-store
observer.next(value);
});
return () => {
// cleanup logic. HERE IS A PROBLEM
// calling store.dispatch() directly in your Epics is deprecated and will be removed.
// what should I use instead?
state.dispatch(actions.signInError({}));
};
})
));
};
Также я новичок в rxjs, и если у вас есть совет, как я могу улучшить или сделать код красивее, я более чем заинтересован!