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);
这符合我的预期。
我正在构建一个 "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);
这符合我的预期。