2016-03-30 7 views
4

Ich habe eine Situation, wo ich brauche einen Token auf einer cordova App erneut zu authentifizieren, bevor die Authentifizierungstoken abläuft. Um dies zu tun, dachte ich, ich würde eine Zeitüberschreitung setzen, bevor das Authentifizierungs-Token abläuft, um es erneut zu authentifizieren.Was passiert mit setTimeout, wenn das Fenster nicht im Fokus ist?

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

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

Problem konnte ich sehen ist, dass-

  1. Die Timeout-Zeit abgelaufen ist, während die App schläft. Funktion feuert nicht?

  2. Der Timeout „Countdown“ (wenn das ist, wie es funktioniert) angehalten wird, während die App schlafen.

Keine von beiden sind gute Szenarien. Meine Frage ist also, was passiert mit einem Timeout, während die Anwendung nicht im Fokus ist? Sollte ich stattdessen ein 10-Sekunden-Intervall haben, das den Ablauf für dieses Szenario überprüft?

Edit:

kann also sagen, dass das Token für 4 Stunden. Wenn der Benutzer die App für eine Stunde nutzt, sie für 2 Stunden minimiert und zurückkommt, ruft die Funktion eine Stunde oder 3 Stunden an? Dies wäre der Punkt des Intervalls, also kann ich die Situation relativ schnell überprüfen.

+0

Sie werden das gleiche Problem mit dem Intervall erhalten. Warum nicht das Leben des Tokens erhöhen - vorausgesetzt, Sie haben die Kontrolle darüber? – Darren

+0

Ich habe das nicht unter Kontrolle. –

+0

Javascript läuft im selben Thread wie die Benutzeroberfläche des Browsers. Daher wird setTimeout oder setInterval nicht ausgeführt, um ausgeführt zu werden, wenn Sie aber einige Zeit später angeben. Web Workers könnte eine Möglichkeit sein, mit diesem Problem umzugehen. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers ein Beispiel verwendet wird, hier http://stackoverflow.com/questions/22043120/settimeout-from-a-web-worker –

Antwort

0

Die Timeout-Verhalten hängt wirklich von dem Gerätetyp und Betriebssystem-Version. Bei einigen werden alle fälligen Timer ausgelöst, sobald die Anwendung aktiv wird. Auf anderen (und ich glaube, dies ist der Fall für das aktuelle iOS), wird der Timer angehalten, während Ihre Anwendung inaktiv ist und wird fortgesetzt, wenn sie aktiv wird.

Für einen lang laufenden Timer (d. H. Ihr 4-Stunden-Beispiel) können Sie sich nicht auf die setTimeout() verlassen, da auf einigen Geräten die inaktive Zeit nicht berücksichtigt wird. Sie müssen Cordova's resume event abonnieren und Ihre Timer neu berechnen und aktualisieren. Die folgende setLongTimeout()-Funktion sollte sich wie erwartet in Cordoval verhalten. Es ist nicht getestet und müsste erweitert werden, wenn Sie mehrere lange Timeouts benötigen.

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(); 
     } 
    }); 
}); 
Verwandte Themen