当窗口失焦时,setTimeout会发生什么?

时间:2016-03-30 19:13:45

标签: javascript cordova ionic-framework hybrid-mobile-app

我有一种情况需要在身份验证令牌到期之前在cordova应用上重新验证令牌。要做到这一点,我想我会在auth令牌到期之前设置超时,以重新进行身份验证。

function authenticate() {
  var token = ... get token

  setTimeout(function() {
    .. try to reauthenticate
  }, token.expiresIn - 600*1000);
}

我能看到的问题是 -

  1. 应用程序处于休眠状态时超时时间过去了。功能不起作用?

  2. 超时"倒计时" (如果它的工作方式)在应用程序休眠时暂停。

  3. 这些都不是好方案。所以我的问题是,当应用程序失焦时,超时会发生什么?我是否应该有10秒的时间间隔来检查这种情况的到期时间?

    修改

    让我们说令牌是4个小时。如果用户使用该应用程序一小时,将其最小化2小时并返回,该功能是否会在一小时或3小时内调用?这将是间隔点,所以我可以相对快速地检查情况。

1 个答案:

答案 0 :(得分:1)

超时行为实际上取决于设备类型和操作系统版本。在某些情况下,一旦应用程序变为活动状态,“到期”的任何计时器都会触发。在其他人(我认为这是当前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();
        }
    });
});