我正在建立一個「檢查用戶是否驗證,如果是,每2分鐘刷新一次會話」功能,並且想在反應中使用它作爲onEnter鉤子,路由器(v2.8.1)需要認證的路由。setInterval內的反應路由器onEnter調度redux行動
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())
的時候,我得到Uncaught SyntaxError: Unexpected identifier
從鍍鉻內(誤差來源是VM{someNumbers}:1
,當我打開它我看到[object Promise]
我使用redux-thunk
中間件,和我的行動不會返回一個承諾,但我似乎無法以某種方式捕獲錯誤,並從refreshSession
行動上的錯誤重定向
編輯。: setInte rval需要一個函數來調用。所以setInterval(() => store.dispatch())
按我最初的預期工作。
解決了它。這是無關的終極版/反應,路由器等 的setInterval需要一個函數來調用,所以交換 的setInterval(store.dispatch())爲的setInterval(()=> store.dispatch())完美地工作 – lewiscowper
你可以回答您自己的問題並將其標爲已接受。這可能會在未來遇到類似問題時幫助其他人。 –