2016-10-04 74 views
1

我正在建立一個「檢查用戶是否驗證,如果是,每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())按我最初的預期工作。

+1

解決了它。這是無關的終極版/反應,路由器等 的setInterval需要一個函數來調用,所以交換 的setInterval(store.dispatch())爲的setInterval(()=> store.dispatch())完美地工作 – lewiscowper

+0

你可以回答您自己的問題並將其標爲已接受。這可能會在未來遇到類似問題時幫助其他人。 –

回答

0

setInterval需要一個函數來調用。

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

這是按我期望的方式工作的。