react-router onEnter 中的 setInterval 调度 redux 动作

setInterval within react-router onEnter dispatching redux actions

我正在构建一个 "check if user is authenticated, if so, refresh their session every 2 minutes" 函数,并希望将其用作需要身份验证的 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)}
/>

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

我正在使用 redux-thunk 中间件,我的操作确实 return 一个承诺,但我似乎无法以某种方式捕获错误,并在出现错误时从 refreshSession行动。

编辑:setInterval 需要一个函数来调用。所以 setInterval(() => store.dispatch()) 按照我最初的预期工作。

setInterval 需要一个函数来调用。

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

这符合我的预期。