当我尝试使用react-router-redux 5.0.0-alpha.9时,我被一个Saga中发生的错误卡住了。
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('/')));当我调试到它时,推送是未定义的。我没有理由这样做。我有一个完全相同的代码在一个不同的传奇中工作:
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));
}
}它可以很好地改变路由。我还没弄明白为什么一个能用而另一个不能。有什么想法吗?
有没有更好的方法来做这件事?我试图在操作中进行路由,但在呈现组件之前,组件中的状态没有更新,所以我必须以某种方式执行服务,更新状态,然后更新路由。迷惑于做这件事的最佳方式。
谢谢!
发布于 2018-10-15 21:43:51
尝试使用yield put(push(YOUR_ROUTE))
https://stackoverflow.com/questions/50362171
复制相似问题