Я застрял в сообщении об ошибке, которая произошла в Saga при попытке использовать Reaction-router-redux 5.0.0-alpha.9.
import { push } from 'react-router-redux';
import ReactOnRails from 'react-on-rails';
import { call, put, takeLatest } from 'redux-saga/effects';
import { LOGIN, loginSuccess, loginFailure } from '../users/actions';
import loginService from './services';
function* loginSaga(action) {
const { loginValues } = action;
try {
const loginData = yield call(loginService, loginValues);
const store = ReactOnRails.getStore('appStore', false);
yield put(loginSuccess(loginData));
yield call(store.dispatch(push('/')));
} catch (error) {
yield put(loginFailure(error.response.data.error));
}
}
function* loginWatcherSaga() {
yield takeLatest(LOGIN, loginSaga);
}
export default loginWatcherSaga;
Проблема возникает при успешном входе в систему. Он успешно вызовет действие 'loginSuccess', а затем перейдет к строке yield call(store.dispatch(push('/')));
, но бомбит и прыгает на улов. Вот сообщение об ошибке:
utils.js:225 uncaught at check call: argument fn is undefined
log @ utils.js:225
check @ utils.js:29
getFnCallDesc @ io.js:88
call @ io.js:113
loginSaga @ sagas.js:14
next @ proc.js:311
currCb @ proc.js:388
(anonymous) @ proc.js:499
exec @ scheduler.js:19
flush @ scheduler.js:60
asap @ scheduler.js:33
runPutEffect @ proc.js:486
runEffect @ proc.js:435
next @ proc.js:315
currCb @ proc.js:388
Promise.then (async)
resolvePromise @ proc.js:450
runCallEffect @ proc.js:517
runEffect @ proc.js:435
next @ proc.js:315
proc @ proc.js:270
runForkEffect @ proc.js:554
runEffect @ proc.js:435
next @ proc.js:315
currCb @ proc.js:388
takeCb @ proc.js:466
put @ channel.js:73
(anonymous) @ channel.js:161
(anonymous) @ channel.js:186
exec @ scheduler.js:19
flush @ scheduler.js:60
asap @ scheduler.js:33
(anonymous) @ channel.js:185
emit @ channel.js:26
(anonymous) @ middleware.js:67
login @ LoginForm.jsx:131
handleSubmit @ LoginForm.jsx:31
callCallback @ react-dom.development.js:542
По сути это бомбардировка по этой линии:
yield call(store.dispatch(push('/')));
Когда я отлаживаю его, push не определен. У меня нет причин, почему. У меня есть точный код, работающий в другой саге:
function* setPasswordSaga(action) {
try {
const response = yield call(setPasswordService, action.passwordValues);
const store = ReactOnRails.getStore('appStore', false);
yield put(setPasswordSuccess(response));
yield call(store.dispatch(push('/')));
} catch (error) {
yield put(setPasswordFailure(error.response.data.user));
}
}
Это меняет маршрутизацию просто отлично. Я не смог понять, почему один работает, а другой нет. Есть идеи?
Есть ли лучший способ сделать это? Я пытался выполнить маршрутизацию в действии, но состояние не обновлялось в компоненте до его визуализации, поэтому мне нужно каким-то образом выполнить службу, обновить состояние, а затем обновить маршрут. Смущен лучшим способом сделать это.
Спасибо!