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;
});
}
});
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
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