React-Router-Redux / Sagas / Push Undefined - PullRequest
0 голосов
/ 16 мая 2018

Я застрял в сообщении об ошибке, которая произошла в 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));
  }
}

Это меняет маршрутизацию просто отлично. Я не смог понять, почему один работает, а другой нет. Есть идеи?

Есть ли лучший способ сделать это? Я пытался выполнить маршрутизацию в действии, но состояние не обновлялось в компоненте до его визуализации, поэтому мне нужно каким-то образом выполнить службу, обновить состояние, а затем обновить маршрут. Смущен лучшим способом сделать это.

Спасибо!

1 Ответ

0 голосов
/ 15 октября 2018

Попробуйте с yield put(push(YOUR_ROUTE))

...