react -terval within react-router onEnter dispatching redux actions

时间:2016-10-04 12:43:53

标签: reactjs redux react-router react-redux

我正在构建一个"检查用户是否经过身份验证,如果是,请每2分钟更新一次会话"函数,并希望将其用作需要身份验证的react-router(v2.8.1)路由中的onEnter挂钩。

const requireAuth = (store, nextState, replace) => {
  const redirectToLogin = (state, cb) => cb({
    pathname: '/login',
    state: { nextPathname: state.location.pathname }
  });

  if (getToken() === null) {
    redirectToLogin(nextState, replace);
  } else {
    const authInterval = setInterval(
      store.dispatch(refreshSession()).catch(() => redirectToLogin(nextState, replace))
    , 120000);
    store.dispatch(setRefreshSessionTimer(authInterval));
  }
};

我在.bind(this, store)的路线中使用此功能(这对我来说似乎有些不确定,但是有效)。

<Route
  path='/protected'
  onEnter={requireAuth.bind(this, store)}
/>

我还有onLeave定义的clearAuthInterval,但当前的问题是,当从setInterval内部调用dispatch(refreshSession().catch())时,我从chrome中得到Uncaught SyntaxError: Unexpected identifier(错误源是{{1当我打开它时,我看到VM{someNumbers}:1

我使用[object Promise]中间件,我的操作确实返回了一个承诺,但我似乎无法以某种方式捕获错误,并重定向redux-thunk操作中的错误。< / p>

编辑:setInterval需要一个函数来调用。所以refreshSession的工作原理与我原先预期的一样。

1 个答案:

答案 0 :(得分:0)

setInterval需要一个函数来调用。

const authInterval = setInterval(() =>
  store.dispatch(refreshSession()).catch(() => redirectToLogin(nextState, replace))
, 120000);

这是我期望的方式。