所以我的代码中有一个postActions.js,我在这里编写所有的Redux操作代码。其中的一个功能是注销代码。
这就是代码。
export const logout = () => {
localStorage.removeItem('token');
localStorage.removeItem('expirationDate');
return {
type: AUTH_LOGOUT
}
}
在达到过期时间后,将调用此注销操作创建者。这是使用setTimeout函数完成的,如下所示。
export const checkAuthTimeout = expirationTime => {
return dispatch => {
timeoutVar = setTimeout(() => {
dispatch(logout());
}, expirationTime*1000);
}
}
timeoutVar是在代码的顶部声明的,在所有像这样的函数之外。
var timeoutVar;
现在是我的问题。每当一个人在应用程序中处于活动状态时,我都想将setTimeout更改为稍后的时间,这样他在活动时就不会注销。这是用这样的代码完成的。logoutTime是用于setTimeout的新时间。
clearTimeout(timeoutVar);
dispatch(checkAuthTimeout(logoutTime));
由于某些原因,上面的代码没有更改setTimeout。假设logoutTime是10,它应该在10秒后更改setTimeout,但它不会更改任何内容。
如果我只使用clearTimeout(timeoutVar)
,计时器将停止。这是有效的。但是,当我也使用dispatch(checkAuthTimeout(logoutTime))
时,事件发生在旧时间本身。我被这个问题困扰了很长一段时间。请帮忙。
自从React以来,我的组件被多次调用,这多次触发了setTimeout函数。因此,有多个setTimeout实例正在运行。我在函数调用之外调用了setTimeout,如下所示-
clearTimeout(timeoutVar);
dispatch(checkAuthTimeout(logoutTime));
但是,由于一些生命周期方法没有clearTimeout,checkAuthTimeout也在没有clearTimeout的其他位置被调用,这创建了许多setTimeout实例。最安全的选择是在函数中移动clearTimeout。就像这样。
export const checkAuthTimeout = expirationTime => {
return dispatch => {
clearTimeout(timeoutVar); // ADD THIS JUST BEFORE SETTIMEOUT
timeoutVar = setTimeout(() => {
dispatch(logout());
}, expirationTime*1000);
}
}
我只需要一直在setTimeout之前添加一个clearTimeout。