当 window 失焦时 setTimeout 会发生什么?
What happens to setTimeout when the window is out of focus?
我有一种情况需要在身份验证令牌过期之前在 cordova 应用程序上重新验证令牌。为此,我想我会在身份验证令牌到期之前设置一个超时,以重新进行身份验证。
function authenticate() {
var token = ... get token
setTimeout(function() {
.. try to reauthenticate
}, token.expiresIn - 600*1000);
}
我能看到的问题是-
超时时间在应用休眠时结束。函数不触发?
超时 "countdown"(如果它是这样工作的)在应用休眠时暂停。
这两个都不是好的场景。所以我的问题是,当应用程序失焦时超时会发生什么?我是否应该有一个 10 秒的时间间隔来检查这种情况的到期时间?
编辑:
所以假设令牌是 4 小时。如果用户使用该应用程序一个小时,将其最小化 2 小时并返回,该功能会在 1 小时还是 3 小时后调用?这就是间隔点,所以我可以比较快速地查看情况。
超时行为实际上取决于设备类型和 OS 版本。在某些情况下,任何 "due" 的计时器都会在应用程序激活后立即触发。在其他情况下(我相信当前 iOS 就是这种情况),计时器会在您的应用程序处于非活动状态时暂停,并在它变为活动状态时恢复。
对于长 运行 计时器(即您的 4 小时示例),您不能依赖 setTimeout()
,因为在某些设备上它不会考虑非活动时间。您需要订阅 Cordova's resume event 并重新计算和更新您的计时器。以下 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();
}
});
});
我有一种情况需要在身份验证令牌过期之前在 cordova 应用程序上重新验证令牌。为此,我想我会在身份验证令牌到期之前设置一个超时,以重新进行身份验证。
function authenticate() {
var token = ... get token
setTimeout(function() {
.. try to reauthenticate
}, token.expiresIn - 600*1000);
}
我能看到的问题是-
超时时间在应用休眠时结束。函数不触发?
超时 "countdown"(如果它是这样工作的)在应用休眠时暂停。
这两个都不是好的场景。所以我的问题是,当应用程序失焦时超时会发生什么?我是否应该有一个 10 秒的时间间隔来检查这种情况的到期时间?
编辑:
所以假设令牌是 4 小时。如果用户使用该应用程序一个小时,将其最小化 2 小时并返回,该功能会在 1 小时还是 3 小时后调用?这就是间隔点,所以我可以比较快速地查看情况。
超时行为实际上取决于设备类型和 OS 版本。在某些情况下,任何 "due" 的计时器都会在应用程序激活后立即触发。在其他情况下(我相信当前 iOS 就是这种情况),计时器会在您的应用程序处于非活动状态时暂停,并在它变为活动状态时恢复。
对于长 运行 计时器(即您的 4 小时示例),您不能依赖 setTimeout()
,因为在某些设备上它不会考虑非活动时间。您需要订阅 Cordova's resume event 并重新计算和更新您的计时器。以下 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();
}
});
});