Dans le cadre d’un développement d’assistant de réservation d’une des application de Lucca dont je vais faire un article prochainement, j’ai eu à gérer un problème javascript qui apparaît surtout quand on utilise le Asynchrone de l’AJAX. En gros, dans certains cas, le contenant devant se remplir de son contenu n’est pas pret quand le contenu arrive ! et il faut attendre un peu, mais sans bloquer le navigateur, que les choses se fassent pour passer à la suite.
La fonction waitfor permet de tenter une action plusieurs fois :
-
//waitFor(function(){myState.ParticipantClicked();}, function(){ return $(‘icone_participants’)}, 100, DateAdd(‘s’,1,(new Date()))))
-
function waitFor(fonctionAExecuter, condition, interval, fin){
-
if (condition()) fonctionAExecuter();
-
else{
-
if(compareObjDate(fin,(new Date()),‘DIFF’)>0) setTimeout(function(){waitFor(fonctionAExecuter, condition, interval, fin);},interval);
-
}
-
}
-
//nb = compareObjDate(newDate,(new Date()),’DIFF’)
-
function compareObjDate(date_1, date_2, operateur){
-
diff = date_1.getTime()-date_2.getTime();
-
if (diff>0){
-
date_min = date_2;
-
date_max = date_1;
-
}else if (diff<0){
-
date_min = date_1;
-
date_max = date_2;
-
}
-
if (operateur == ‘MIN’) return date_min
-
if (operateur == ‘MAX’) return date_max;
-
if (operateur == ‘DIFF’) return (diff==0?diff:diff/Math.abs(diff));
-
}
-
//DateAdd(‘ms’,100,dateObj))
-
//DateAdd(‘d’,1,dateObj))
-
function DateAdd(timeU,byMany,dateObj) {
-
var millisecond=1;
-
var second=millisecond*1000;
-
var minute=second*60;
-
var hour=minute*60;
-
var day=hour*24;
-
var year=day*365;
-
var newDate;
-
var dVal=dateObj.valueOf();
-
switch(timeU) {
-
case « ms »: newDate=new Date(dVal+millisecond*byMany); break;
-
case « s »: newDate=new Date(dVal+second*byMany); break;
-
case « mi »: newDate=new Date(dVal+minute*byMany); break;
-
case « h »: newDate=new Date(dVal+hour*byMany); break;
-
case « d »: newDate=new Date(dVal+day*byMany); break;
-
case « y »: newDate=new Date(dVal+year*byMany); break;
-
}
-
return newDate;
-
}
Une autre approche consiste à envoyer en parametre d’une premiere fonction, la fonction a éxécuter en retour, mais pour celà, il faut une execution plutot linéaire…
les deux fonctions de gestion de date (compareObjDate et DateAdd) ont été reprises (http://www.codingforums.com/showthread.php?t=3955 et http://www.commentcamarche.net/forum/affich-1987996-javascript-convertir-une-date-et-comparer) et en partie modifiée