Javascript 当窗口失焦时,setTimeout会发生什么情况?
我的情况是,我需要在认证令牌过期之前重新认证cordova应用程序上的令牌。为此,我想我应该在身份验证令牌到期之前设置一个超时,以便重新身份验证Javascript 当窗口失焦时,setTimeout会发生什么情况?,javascript,cordova,ionic-framework,hybrid-mobile-app,Javascript,Cordova,Ionic Framework,Hybrid Mobile App,我的情况是,我需要在认证令牌过期之前重新认证cordova应用程序上的令牌。为此,我想我应该在身份验证令牌到期之前设置一个超时,以便重新身份验证 function authenticate() { var token = ... get token setTimeout(function() { .. try to reauthenticate }, token.expiresIn - 600*1000); } 我能看到的问题是- 应用程序处于睡眠状态时超时时间已过。功能
function authenticate() {
var token = ... get token
setTimeout(function() {
.. try to reauthenticate
}, token.expiresIn - 600*1000);
}
我能看到的问题是-
假设代币是4个小时。如果用户使用该应用程序一小时,将其最小化2小时,然后返回,该功能将在一小时或3小时后调用?这将是时间间隔点,因此我可以相对快速地检查情况。超时行为实际上取决于设备类型和操作系统版本。在某些情况下,任何“到期”的计时器都会在应用程序激活时立即触发。在其他情况下(我相信当前的iOS就是这样),计时器在应用程序处于非活动状态时暂停,在应用程序处于活动状态时恢复 对于长时间运行的计时器(例如,您的4小时计时器),您不能依赖
setTimeout()
,因为在某些设备上,它不会计算非活动时间。您需要订阅、重新计算和更新计时器。下面的setLongTimeout()
函数应在Cordoval中按预期运行。它未经测试,如果需要多次长时间超时,则需要对其进行扩展
var longTimeoutId, longTimeoutDate, longTimeoutCallback;
// Use instead of `setTimeout()` for a long timeout in Cordova
function setLongTimeout(callback, delay) {
if (longTimeoutId) {
clearTimeout(longTimeoutId);
}
longTimeoutCallback = callback;
longTimeoutDate = Date.now() + delay;
longTimeoutId = setTimeout(function() {
longTimeoutId = null;
callback();
}, delay);
}
document.addEventListener("deviceready", function() {
document.addEventListener("resume", function() {
if (longTimeoutId) {
setLongTimeout(callback, longTimeoutDate - Date.now();
}
});
});
您将在间隔中遇到相同的问题。为什么不增加令牌的使用寿命?假设你能控制它?我不能控制它。Javascript与浏览器UI在同一个线程上运行,因此setTimeout或setInterval不需要在指定时执行,而是在一段时间之后执行。网络工作者可能是解决这个问题的一种方法。这里使用了一个例子