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 :
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.");
	};
};
Son utilisation est simple :
- 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 !