更改setTimeout在React with Redux中不起作用



所以我的代码中有一个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。

相关内容

  • 没有找到相关文章

最新更新