Bonjour à tous,
J'ai écrit une classe Scheduler, ayant pour rôle d'exécuter une fonction donnée à une heure donnée. Voilà le bestiau :
Son utilisation est simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 if("undefined" == typeof(Hordodo)) var Hordodo = {}; //FIXME obligé de faire cette bidouille cradingue pour utiliser setTimeout() //ne fonctionne que si l'on a qu'une instance de Scheduler Hordodo.schedulerInstance = null; Hordodo.Scheduler = function(task) { Hordodo.schedulerInstance = this; this.task_ = task; //fonction à exécuter this.timeout_ = null; this.enabled = false; this.process_ = function() { if(this.enabled) this.task_(); window.alert("test2"); }; //executionTimeStr : chaine au format HH:MM:SS this.setExecutionTime = function(executionTimeStr) { //découpage du temps donné en heures, minutes et secondes var executionTimeStrArray = executionTimeStr.split(':'); var executionTimeHours = parseInt(executionTimeStrArray[0]); var executionTimeMinutes = parseInt(executionTimeStrArray[1]); var executionTimeSeconds = parseInt(executionTimeStrArray[2]); var currentTime = new Date(); //calcul de la date/heure où la tâche doit s'exécuter var executionTime = new Date(currentTime); executionTime.setHours(executionTimeHours); executionTime.setMinutes(executionTimeMinutes); executionTime.setSeconds(executionTimeSeconds); //reporte l'exécution au lendemain si l'heure définie est dans le passé if(executionTime.getTime() < currentTime.getTime()) { executionTime.setDate(executionTime.getDate() + 1); } //calcul du temps nous séparant du moment de l'exécution var executionTimeout = executionTime.getTime() - currentTime.getTime(); //programmation de la tâche if(this.timeout_ != null) clearTimeout(this.timeout_); this.timeout_ = setTimeout("Hordodo.schedulerInstance.process_();", executionTimeout); window.alert("Exécution dans " + executionTimeout / 1000 + " secondes."); }; };
- on crée une instance de Scheduler, en lui passant une fonction à exécuter ;
- on définit une heure d'exécution (fonction setExecutionTime(), prenant une chaine HH:MM:SS), en interne la classe utilise la fonction standard setTimeout() pour programmer l'exécution de la fonction données au constructeur ;
- on active le scheduler (via la variable membre enabled) ;
- la fonction est exécutée.
Au début, tout semble bien se passer. Mais au bout de plusieurs tests, le script plante : il n'est plus possible de faire exécuter quoi que ce soit au scheduler.
Plus particulièrement, via une interface graphique (qui est le about:config de Firefox, étant donné qu'il s'agit d'une extension que je code ici, mais c'est un détail), je redéfinis à plusieurs reprises l'heure du scheduler, j'obtiens les alertes attendues (« Exécution dans X secondes »). Mais une fois que j'attends l'exécution effective de la fonction passée au scheduler, c'est à ce moment que le script plante. Plus aucune alerte ne s'affiche. C'est étrange, étant donné que la fonction passée au scheduler est une simple alerte, donc assurément sans effet de bord.
On ne peut pas dire que j'aie un très bon niveau en JavaScript, donc ce qui m'échappe peut aussi bien être une grosse idiotie qu'une fine subtilité…
Bref, j'attends vos réponse !![]()
Partager