首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React-Router-Redux / Sagas / Push未定义

React-Router-Redux / Sagas / Push未定义
EN

Stack Overflow用户
提问于 2018-05-16 11:42:39
回答 1查看 555关注 0票数 1

当我尝试使用react-router-redux 5.0.0-alpha.9时,我被一个Saga中发生的错误卡住了。

代码语言:javascript
复制
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('/')));行,但它会轰炸并跳转到捕获。以下是错误消息:

代码语言:javascript
复制
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

本质上,它是在这一行上轰炸:

代码语言:javascript
复制
yield call(store.dispatch(push('/')));

当我调试到它时,推送是未定义的。我没有理由这样做。我有一个完全相同的代码在一个不同的传奇中工作:

代码语言:javascript
复制
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));
  }
}

它可以很好地改变路由。我还没弄明白为什么一个能用而另一个不能。有什么想法吗?

有没有更好的方法来做这件事?我试图在操作中进行路由,但在呈现组件之前,组件中的状态没有更新,所以我必须以某种方式执行服务,更新状态,然后更新路由。迷惑于做这件事的最佳方式。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-10-15 21:43:51

尝试使用yield put(push(YOUR_ROUTE))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50362171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档