2016-03-15 3 views
0

Je travaille avec Ember-Simple-Auth pour authentifier mon application sur un serveur distant qui me sert un jeton API qui doit être actualisé toutes les 30 minutes grâce à l'utilisation d'un nouveau jeton. Pour ce faire, j'ai inclus un appel asynchrone à la méthode de restauration ember-Simple-Auth qui implémente le rafraîchissement des jetons, qui devrait se déclencher toutes les 25 minutes en utilisant setTimeout. Cependant, sur les trois appels à setTimeout, seul un fonctionne correctement bien que pour moi, ils semblent tous être les mêmes. Pouvez-vous, par hasard, m'aider à ce sujet?setTimeout ne fonctionne pas

Exemple de code:

export default Base.extend({ 
    restore(data) { 
    console.log("restoring"); 
    var renewDelay = 30000; //set to 30 seconds for testing purpose 
    var expirates = data.expirates * 1000; //server response lists expiration as a unix timestamp in seconds 
    var current = new Date().getTime(); 

    if (expirates < current) { 
     console.log("token expired " + expirates + " " + current); 
     return Ember.RSVP.reject(); 
    } else { 
     if (expirates - current > renewDelay/4) { 
     console.log("token valid " + expirates + " " + current + ", renew in " + Number(expirates - current - 30000)); 
     //this one works as expected after 30s 
     setTimeout(this.restore, expirates - current - renewDelay, data); 
     return Ember.RSVP.resolve(data); 
     } else { 
     console.log("token valid " + expirates + " " + current + ", renewing now"); 
     return Ember.$.ajax({ 
      method: "GET", 
      url: "/renew", 
      accepts: 'application/json', 
      headers: { 
      Authorization: data.renew_token 
      } 
     }) 
     .then(function(data) { 
      console.log("next renew in " + Number((data.expirates * 1000) - current - renewDelay)); 
      //this one is never called 
      setTimeout(this.restore, (data.expirates * 1000) - current- renewDelay, data); 
      return data; 
     }); 
     }, 
    }, 
    authenticate(identification, password) { 
    console.log("authenticating"); 
    return Ember.$.ajax({ 
    method: "POST", 
    url: "/auth", 
    contentType: 'application/json', 
    accepts: 'application/json', 
    data: JSON.stringify({ username: identification, password: password }) 
    }) 
    .then(function(data) { 
    console.log("next renew in " + Number((data.expirates * 1000) - new Date().getTime() - 30000)); 
     //this one is not triggered either 
    setTimeout(this.restore, (data.expirates * 1000) - new Date().getTime() - 30000, data); 
    return data; 
    }); 
} 
}); 
+0

Essayez de le déboguer, ajoutez un 'console.log (this, this.restore)'; avant les lignes particulières. 2ème: afaik, vous ne pouvez pas compter sur le passage de fonctions-args à travers 'setTimeout()'. Cela ne fonctionne toujours pas dans tous les navigateurs. – Thomas

+2

ne résoudra probablement pas votre problème, mais il est recommandé d'utiliser [Ember.run.later] (http://emberjs.com/api/classes/Ember.run.html#method_later) au lieu de pure 'setTimeout' – Pavol

Répondre

0

Votre this.restore dans les deux callbacks pourrait probablement se référer à ce mal, ce qui provoque la fonction de restauration de ne jamais s'appeler. Avez-vous essayé de déboguer ce que fait référence à? L'utilisation de rappels fléchés pourrait résoudre ce problème, comme

.then((data) => { 
    ... 
    setTimeout(this.restore, (data.expirates * 1000) - new Date().getTime() - 30000, data); 

}); 
+0

Merci beaucoup anssikin –

0

simplifiez votre code.

Essayez ceci:

var timeOutDelay = expirates - current- renewDelay; 
setTimeout(restore, timeOutDelay, data); 
+0

I l'ai essayé, mais rien n'a changé –