Ralentir l'execution d'un script

Résolu
Tanahe Messages postés 6 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 9 juin 2013 - 8 mars 2009 à 03:32
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 - 8 mars 2009 à 14:16
bonjour
dans le code de mon site je fait appel a bcp de petit fichiers .JS que je charge en temps reel pour eviter d'alourdir le chargement de la page.
le code me posant soucie

function create_select_eqpm(db){
Neqpm = db;
loadDb(Neqpm); (1) <-- chargement du fichier .JS correspondant a l'equipement demander
// alert('ok')
(2)
cod_select2 = '<select onchange="calcul(this.value)">';
    for(i=2;dbequip[Neqpm][i][0] !='end';i++){
    cod_select2 += '<option value="';

    cod_select2 += dbequip[Neqpm][i][8] ;
    cod_select2 += '"> Lv ' + dbequip[Neqpm][i][1] ;
    cod_select2 += ' ' + dbequip[Neqpm][i][2] ;
    cod_select2 += '( prix: ' + dbequip[Neqpm][i][8] ;
    cod_select2 += 'pO)</option>';
    } i=0;
cod_select2 += '</select>';
document.getElementById('select2').innerHTML = cod_select2;
}

Mon souci est que la Db n'as pas le temps de se charger(1)  avant la creation du code (2).
J'ai comme resultatdbequip[Neqpm]is undefined.
il suffit que j'active l'alert et sa fonctionne. Le temps que je clic, la Db a le temps de se charger, avant la creation du code.
j'ai essayer une boucle for, j 'essayer une boucle while avec une sortie a la fin de la db..
j'ai essayer de mettre la db dans une fonction que j'appell.. mais c'est la fonction qui est indefinit
comment puis je faire pour executer le reste du script apres une confirmation de la lecture de la db svp ?

merci bcp ^^

5 réponses

Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
8 mars 2009 à 13:02
tu parles de DB... comme Data Base ???,
en javascript, seul IE [ ;o)) ] permet de gérer des Basses de Données.

>>permet de temporiser a volonter tout le process
aie, aie aie  ! rien de pire que ce que tu utilises ! tu bloques toutes les ressources !
met au moins un setTimeout

>>pour y inclure un "ticket de fin" en fin de chargement de la db,

soit dans la fonction tu positionnes une variable à true
      et derrière l'appel tu attends tant qu'elle ne l'est pas
      MAIS avec setTimeout, sinon... !
soit les instructions qui suivent l'appel, tu les mets en fin de ta fonction

ça me semble particulièrement lourd et compliqué ce que tu fais
( sans jugement de valeur ), à mon avis une conception à revoir
3
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
8 mars 2009 à 09:52
Bonjour,

>>je fait appel a bcp de petit fichiers .JS que je charge en temps reel
ça veut dire quoi en temps réel ?
<script src=> ou appendChild d'un élément script ?

>>pour eviter d'alourdir le chargement de la page.
mais l'un ou l'autre, il faudra bien les charger !
et je doute que cela aille plus vite de charger 15 fichiers
de 1Ko plutôt qu'un seul de 15Ko ( surtout qu'on doit
gagner quelques octets ;o))

>>Mon souci est que la Db n'as pas le temps de se charger(1) 
donc probablement appel à ajax ?
tu es en asynchrone ? il faut attendre le retour

>>avant la creation du code (2
le code est derrière l'appel loadDb(Neqpm) ?
si oui... l'appel à cette fonction n'attend pas son retour
mais continue immédiatement à l'instruction suivante
il faut mettre ces instructions en fin de fonction loadDb par exemple

>>document.getElementById('select2').innerHTML = cod_select2;
ça ne fonctionnera probablement pas avec IE !

Cordialement
0
Tanahe Messages postés 6 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 9 juin 2013
8 mars 2009 à 12:37
rebonjour ^^
Il n'y a aucun Php/Ajax dans mon site. uniquement des languages clients : Html,Css,Javascript.

le code de mon chargeur script est du type appendChild :

function loadscript(file,iddiv){
  var scriptTag = document.getElementById(iddiv);
  var head = document.getElementsByTagName('head').item(0)
 
  if(scriptTag) head.removeChild(scriptTag);
  script = document.createElement('script');
    script.src = file;
    script.type = 'text/javascript';
    script.id = iddiv;
head.appendChild(script)
return;
}

enfaite se qui ralentie bcp le navigateur n'est pas la taille du fichiers .JS mais les dizaines de fonctions et les dizaines de Lourdes variables du type :

dbequip[''] = new Array(
["ID","Lv","Nom" ,"For","Def","Dex","Con","Mag","buy","sell"  ,"image"    ,"end"    ],
["" ,""   ,""    ,""   ,""   ,""   ,""   ,""   ,""   ,""      ,""         ,"end"    ],
[1  ,1    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"1.jpg"    ,"end"    ],
[2  ,2    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"2.jpg"    ,"end"    ],
[3  ,3    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"3.jpg"    ,"end"    ],
[4  ,4    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"4.jpg"    ,"end"    ],
[5  ,5    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"5_1.jpg"  ,"end"    ],
[6  ,5    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"5_2.jpg"  ,"end"    ],
[7  ,6    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"6.jpg"    ,"end"    ],
[8  ,7    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"7.jpg"    ,"end"    ],
[9  ,8    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"8.jpg"    ,"end"    ],
[10 ,9    ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"9.jpg"    ,"end"    ],
[11 ,10   ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"10_1.jpg" ,"end"    ],
[12 ,10   ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"10_2.jpg" ,"end"    ],
[13 ,11   ,""    ,0    ,0    ,0    ,0    ,0    ,0    ,0       ,"11.jpg"   ,"end"    ],

....................
[50 ,...  ],

["end"]
);
(une partie d'une variable vierge)
j'ai donc du fractionner mes functions/variables un maximum pour n'avoir besoin d'appeler que ceux qu'il me faut.(fractionner le plus gros .JS fait 15Ko)
Mais meme fractionnées certaines bases mettent <1s pour se charger en memoire..
la db etant dans un nouveau fichier et charger par un appendChild, elle est hors du process initial et donc les fonctions en aval n'attendent pas son chargement..
pour y inclure un "ticket de fin" en fin de chargement de la db, il aurait fallut que j'arrete le process initial au chargement du fichier .JS pour le reprendre en fin de chargement de la db. le fichier .JS pouvant etre appeler par different process,il fallait que je puisse retrouver le bon process initial et l'etape d'appel. et les differentes solutions n'etant pas terribles, j'ai cherche autre chose.

pour le innerHTML cela a l'air de fonctionner avec IE7 sans trop de pb
mais j'avoue je suis lache.. j'ai abandonné de rendre mon site full comptable IE :S

sinon j'ai finit par trouver sur la toile un petit script simple et nikel, qui permet de temporiser a volonter tout le process ^^
l'inconveniant est qu'il ne prend pas en compte la fin de chargement de la db.

// www.sean.co.uk
function pausecomp(millis)
{
var date = new Date();
var curDate = null;

do { curDate = new Date(); }
while(curDate-date < millis);
}

Merci  ^^
+
0
Tanahe Messages postés 6 Date d'inscription lundi 23 février 2009 Statut Membre Dernière intervention 9 juin 2013
8 mars 2009 à 14:04
Merci bcp pour tes conseils !! il est vrai que le script me bloque pendant un cours instant et selon la dispo du site et le telechargement du .JS, le temps de pause n'est plus adapter :/

oui Db comme database :s
Au debut j'utilisait une variable avec un tableau a 4 dimentions. mais le chargement sous IE etait trop longs.
Alors je suis passez a 9 .JS contenant chacun une variable a 3 dim. (temps de chargement sous IE / 10 )

j'ai finit par utiliser le setTimeout, comme tu me la conseiller, qui lance une fonction pour la creation du select.

function select_load(db){
    if(db!='nul'){
    Neqpm = db;
    loadDb(Neqpm);
    setTimeout("create_select_eqpm(Neqpm)",200);
    }
}

function create_select_eqpm(Neqpm){
cod_select2 = '<select name="IDeqpm" onchange="affiche_calcul(calc_prix.IDeqpm.value,calc_prix.Choix_nbr_heure.value)">';
for(i=0;dbequip[Neqpm][0][i] !='buy';i++){}ach = i;i=0;

    for(i=1;dbequip[Neqpm][i][0] !='end';i++){
    cod_select2 += '<option value="';
    cod_select2 += i
    cod_select2 += '"> Lv ' + dbequip[Neqpm][i][1] ;
    cod_select2 += ' ' + dbequip[Neqpm][i][2] ;
    cod_select2 += ' ( ' + dbequip[Neqpm][i][ach] ;
    cod_select2 += ' pO)</option>';
    } i=0;

cod_select2 += '</select>'; //alert(cod_select2)
document.getElementById('select2').innerHTML = cod_select2;
}

Je vais quand meme continuer à chercher du coté du "ticket de fin" ! ca serait l'ideal !
merci bcp pour ton aide ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
8 mars 2009 à 14:16
oui.. mais tu n'es nullement à l'abri !
si le temps est > 200 milli secondes
et ça peut arriver !
je te disais d'utiliser un setTimout pour tester
une variable qui serait positionnée par la fonction
( ton ticket de fin"
le mieux, c'est probablement
au lieu de
function appel()
{ traitements de la fonction }
appel();
traitements à suivre
mettre :
function appel()
{ traitements de la fonction
traitements à suivre
}
appel();
</script> !!!!

@+
0
Rejoignez-nous