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

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); } 我能看到的问题是- 应用程序处于睡眠状态时超时时间已过。功能

我的情况是,我需要在认证令牌过期之前重新认证cordova应用程序上的令牌。为此,我想我应该在身份验证令牌到期之前设置一个超时,以便重新身份验证

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

  setTimeout(function() {
    .. try to reauthenticate
  }, token.expiresIn - 600*1000);
}
我能看到的问题是-

  • 应用程序处于睡眠状态时超时时间已过。功能不启动

  • 应用程序睡眠时暂停超时“倒计时”(如果它是这样工作的)

  • 这两种情况都不是好情况。所以我的问题是,当应用程序失去焦点时,超时会发生什么?我是否应该有一个10秒的间隔来检查这个场景的到期时间

    编辑:


    假设代币是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不需要在指定时执行,而是在一段时间之后执行。网络工作者可能是解决这个问题的一种方法。这里使用了一个例子