[JS] faire 'attendre' le return d'une fonction

faire 'attendre' le return d'une fonction [JS] - Programmation

Marsh Posté le 15-07-2002 à 18:58:25    

salut,
 
j'aimerais savoir comment faire pour faire qu'une fonction attende un certain temps avant de renvoyer sa valeur ....
 
en gros j'ai une fonction qui doit matter si en un certain temps il s'est passé quelque chose ,
 
il faut qu'elle regarde toutes les x millisecondes si tel truc a changé et si c'est le cas, elle renvoi TRUE, et si c'est pas le cas, elle rematte un peu après sans dépasser un temps MAXIMUM d'exécution, après lequel elle renvoie FALSE


Message édité par k666 le 15-07-2002 à 19:00:06
Reply

Marsh Posté le 15-07-2002 à 18:58:25   

Reply

Marsh Posté le 15-07-2002 à 19:03:49    

pas possible, le js n'est pas prévu pour. tu imagines la complexité de la chose ?  
 
c'est le code appelant qui doit appeler toutes les x millisecondes.

Reply

Marsh Posté le 15-07-2002 à 19:05:42    

j'ai un truc de ce genre:
 
<script>
 
function zyVa()
{
  var result = checkPendantDixSecondesMax(truc);
  return result;
}
 
function checkPendantDixSecondesMax(truc)
{
  if (tel_truc)
  {
    return true;
  }
  else
  {
    attendsEtRecheck ...etc...etc..
  }
}
 
}

Reply

Marsh Posté le 15-07-2002 à 19:09:28    

attendsEtRecheck ...etc...etc..  ==> setTimeOut(checkPdtDixSec, delay)
 
http://www.htmlite.com/JS018.shtml


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 15-07-2002 à 19:10:02    

ouaip mais yaurait pas une façon de le faire ?
j'ai essayé par la technique des  
  retries
et en faisant un appel récursif à la fonction du style ....
 

fonction reCheckPouett()
{
  if ( c_bon )  
   {
     return true;
   }
  else
   {
     setTimeout("return reCheckPouet()","100" );
   }
}

 
 
mais ça marche pas come ça :s

Reply

Marsh Posté le 15-07-2002 à 19:10:47    

youdontcare a écrit a écrit :

pas possible, le js n'est pas prévu pour.


y'a qq chose que tu ne comprends pas dans cette phrase ?

Reply

Marsh Posté le 15-07-2002 à 19:34:25    

nan sisi je comprends ; mais il y a qd même les fonctions setTimeout et setInterval qui peuvent arranger ça .... no ?
ya pas un moyen de ruser ?

Reply

Marsh Posté le 15-07-2002 à 19:36:12    

je me serais battu pour moins que ca !!!!! :eek2:

Reply

Marsh Posté le 15-07-2002 à 19:42:22    

:lol:  
c vrai que c'était violent mais bon :( on s'y habitue :(
et après on aime ça :p
[:wolfman]

Reply

Marsh Posté le 15-07-2002 à 19:43:36    

sinon, pour la réponse, quelqu'un a-t'il une idée de comment faire ?
 
je rappelle mon problème :
 
j'aimerais qu'une fonction check un flag pendant X secondes maximum, et dès que FLAG OK ou fin du temps régelmentaire, renvoie une valeur ...

Reply

Marsh Posté le 15-07-2002 à 19:43:36   

Reply

Marsh Posté le 15-07-2002 à 19:57:04    

k666 a écrit a écrit :

j'aimerais qu'une fonction check un flag pendant X secondes maximum, et dès que FLAG OK ou fin du temps régelmentaire, renvoie une valeur ...



 
pas possible, pas possible, pas possible, pas possible.
 
pas possible.
 
pas possible !
 
c'est bon c'est rentré ?
 

k666 a écrit a écrit :

je rappelle mon problème :


ton vrai problème c'est que tu veux faire X, tu as pensé à une solution Y, impossible à implémenter. plutôt que de revenir en arrière et te dire "ok ... alors comment faire autrement", tu t'obstines dans l'erreur.
 
PAS POSSIBLE !

Reply

Marsh Posté le 15-07-2002 à 20:02:52    

héhéhé;
je vais te prouver que tu as tort; j'ai réussi à le faire fonctionner; regarde comme c'est simple :p
 

Code :
  1. function readAnswer(acttrack,maxtime)
  2. {
  3. tries++;
  4. // alert('readAnswer('+acttrack+','+maxtime+'); tries='+tries);
  5. if ( tries > max_tries )
  6. {
  7.  // on a dépassé le maximum d'essais ...
  8.  if ( API.historic[acttrack][1] == "new" )
  9.  {
  10.   window.status='1';
  11.   // si valeur indéfini (=new), false
  12.   return false;
  13.  }
  14.  else
  15.  {
  16.   window.status='2';
  17.   // sinon true ...
  18.   return true;
  19.  }
  20. }
  21. else
  22. {
  23.  // on a encore la possibilité d'essayer de chopper un resultat ...
  24.  if ( API.historic[acttrack][1] == "new" )
  25.  {
  26.   window.status='3';
  27.   window.setTimeout("return readAnswer("+acttrack+","+maxtime+" );","100" );
  28. //   alert('settimeout');
  29.  }
  30.  else
  31.  {
  32.   window.status='4';
  33.   return true;
  34.  }
  35. }
  36. }


 
 
bon ya plein de code inutile, j'ai pas nettoyé et pas bien fait, mais ça marche ;)
le secret est dans le  
 
 

Code :
  1. window.setTimeout("return readAnswer("+acttrack+","+maxtime+" );","100" );

Reply

Marsh Posté le 15-07-2002 à 20:07:40    

k666 a écrit a écrit :

héhéhé;
je vais te prouver que tu as tort; j'ai réussi à le faire fonctionner; regarde comme c'est simple :p


tu m'expliques ce que ça a à voir avec ta description du problème ? la fonction ne retourne pas au bout de x millisecondes, elle se fait réappeler par le browser.

Reply

Marsh Posté le 15-07-2002 à 20:37:44    

youdontcare a écrit a écrit :

tu m'expliques ce que ça a à voir avec ta description du problème ? la fonction ne retourne pas au bout de x millisecondes, elle se fait réappeler par le browser.



faut apprendre à lire entre les lignes ici ;)
 
et il fait semblant d'avoir trouvé tout seul en plus :/

Reply

Marsh Posté le 15-07-2002 à 22:24:30    

up :'(
 
 
edit:
 
ça marche pas sur mac  :cry:  :gun:  :gun:  :gun:  :gun:  :gun:


Message édité par k666 le 15-07-2002 à 22:24:50
Reply

Marsh Posté le 15-07-2002 à 22:29:51    

et en fait prenez pas mal ue je pose mal mes questions .... :non:  
j'y peux rien :sol:  
et en fait j'essaye de faire des trucs assez étranges  :jap:
 

Code :
  1. <html>
  2. <head>
  3. <script>
  4. var MAX_FEEDBACK_TIME = 3;
  5. var tries;
  6. var max_tries = 10;
  7. function SCORM()
  8. {
  9. // not implemented :p
  10. //this.LMSGetValue = SCORM_LMSGetValue;
  11. //this.LMSSetValue = SCORM_LMSSetValue;
  12. //this.LMSCommit = SCORM_LMSCommit;
  13. //this.LMSFinish = SCORM_LMSFinish;
  14. this.LMSInitialize = SCORM_LMSInitialize;
  15. this.addStack = SCORM_addStack;
  16. this.historic = new Array();
  17. }
  18. function SCORM_LMSInitialize()
  19. {
  20. // Initialize
  21. act_track = this.addStack("LMSInitialize" );
  22. LMSquery("q=init",act_track);
  23. var result = checkAnswer(act_track,MAX_FEEDBACK_TIME);
  24. if (result)
  25. {
  26.   //alert('cool');
  27. }
  28. else
  29. {
  30.   //alert('spacool');
  31. }
  32. }
  33. function SCORM_addStack(LMSaction)
  34. {
  35. var _current = this.historic.length;
  36. this.historic[_current] = new Array();
  37. this.historic[_current][0] = LMSaction;
  38. this.historic[_current][1] = "new";
  39. this.historic[_current][2] = new Date();
  40. return _current;
  41. }
  42. function LMSquery(query,tracker)
  43. {
  44. lmsframe.location.href = "lmsframe.php?"+query+"&tracker="+tracker;
  45. }
  46. function checkAnswer(acttrack,maxtime)
  47. {
  48. maxtime = maxtime*1000;
  49. tries = 0;
  50. return readAnswer(acttrack,maxtime);
  51. }
  52. function readAnswer(acttrack,maxtime)
  53. {
  54. tries++;
  55. alert('readAnswer('+acttrack+','+maxtime+'); tries='+tries);
  56. if ( tries > max_tries )
  57. {
  58.   // on a dépassé le maximum d'essais ...
  59.   if ( API.historic[acttrack][1] == "new" )
  60.   {
  61.    window.status='1';
  62.    // si valeur indéfini (=new), false
  63.    return false;
  64.   }
  65.   else
  66.   {
  67.    window.status='2';
  68.    // sinon true ...
  69.    return true;
  70.   }
  71. }
  72. else
  73. {
  74.   // on a encore la possibilité d'essayer de chopper un resultat ...
  75.   if ( API.historic[acttrack][1] == "new" )
  76.   {
  77.    window.status='3';
  78.    window.setTimeout("return readAnswer("+acttrack+","+maxtime+" );", maxtime/max_tries );
  79. //   alert('settimeout');
  80.   }
  81.   else
  82.   {
  83.    window.status='4';
  84.    return true;
  85.   }
  86. }
  87. }
  88. var API = new SCORM();
  89. </script>
  90. </head>
  91. <frameset rows="100,*">
  92. <frame name="lmsframe" src="lmsframe.php">
  93. <frame name="contenu" src="contenu.php">
  94. </frameset>
  95. </html>


Message édité par k666 le 15-07-2002 à 22:42:41
Reply

Marsh Posté le 16-07-2002 à 10:03:39    

up  :fou:  
 
j'ai des problèmes, apparemment c pas toléré de faire un setTimeout("return pouet..." );

Reply

Marsh Posté le 16-07-2002 à 10:32:57    

je suis peut etre con, mais a partir du moment ou tu fais un settimeout, tu peux faire un check de ce que tu veux dans ton code.
toutes les millisecondes c un peu trop rapides pour ton povre ordi mais sinon cela passe sans probleme

Reply

Marsh Posté le 16-07-2002 à 11:18:44    

le problème esentiel que je retrouve, c'est que je crée un "moule" pour une sort d'application ....
 
 
cette application va demander des données au "moule" que je suis entrain de faire .....
 
ces données proviennent en fait d'un serveur WEB, donc il faut faire passer une requête HTTP via un frame invisible, avoir la réponse du serveur et ALORS donner la réponse (le return value) à la fonction appelante .....
 
et c'est donc bien cet aller/retour vers le serveur WEB qui me pose problème ...
je veux en quelque sorte patienter pendant un temps maximum acceptable d'avoir la réponse pis la rebalancer à la fonction appelante ....
 
sachant que je peux pas modifier la fonction appelante; je peux pas mettre un setTimeout au niveu de la fonction appelante paske je peux pas toucher à ce contenu,je dois faire le moule ....
 
 
voilà, si quelqu'un a une idée ou sait comment faire j'apprécierai beacoup qu'il parle :)
 
 
parceque je me sens tout paumé et j'arrive pas à trouver d'aide nulle part, ni google groups, ni le forum ni quedalle :(
 
 
merci :)


Message édité par k666 le 16-07-2002 à 11:29:51
Reply

Marsh Posté le 16-07-2002 à 12:05:20    

jdois dire que je capte pas trop ce que tu veux faire
 
dans le cas ou c la recuperation de donnée en dynamique depuis un serveur et de maneire transparente pour le user ce que je propose (solution bourrine est la suivante)
deux frames, une cache et une principale, dans la cache tu utilises le settimeout et a chaque rafraichissement tu redéfinit les données de la frame principale (t as une methode pour ca quoique j ai aps tester comme ca, j avais tester avec la methode de fenetre mere et feneter fille et passage de value de la fille vers la mere)
 
dans la mere soit tu fais un .event sur le changement d'une valeur, soit tu fous un autre timeout qui attend le rafraichissement des données.
 
mais si tu exposais mieux ce que tu veux faire, cela serait plus simple (avec exemple ca serait encore mieux ;) )

Reply

Marsh Posté le 16-07-2002 à 12:42:21    

allez: ptêtre que vous comprendrez mieux :'(
 
Hi!  
 
I would like to delay a return value;  
in fact I have a call to a function,  
this function has to do some actions, reloading a frame;  
this frame, when reloaded, sends new data to the page, so this data must be returned to the called function and then to the first caller;  
 
so i have to wait some time before the data arrives and then return the value to the caller ...  
 
anyone have any ideas on how to do that ????  
 
manythanks  
 

Reply

Marsh Posté le 16-07-2002 à 12:46:08    

le problème que j'ai: c'est que ya une fonction par exemple dans le contenu, qui demande telle ou telle autre donnée,:
 
par exemple:
 
 
var result = API.getValue("coin" );
 
 
==>
 
getValue reloade un frame en demandant la valeur de "coin" ...
la frame se relaode (après x millisecondes) et inscrit la valeur de retour dans un tableau ...
 
dès que cette valeur est inscrite, les getValue fait son return, et ainsi result otient sa valeur .....
 
 
voilà, là je pense que c'est très clair, je sais pas comment distiller plus le problème :cry:  

Reply

Marsh Posté le 16-07-2002 à 12:49:53    

cf. le dernier poste de code; le problème est que c'est presque comme si c'était du multithread  :pt1cable: ....
ya une fonction qui boucle en lecture d'une variable, et pendant ce temps là, une frame, en se rechargeant modifie la valeur de cette variable, et juste là, la fonction qui bouclait renvoie sa vcaleur ....

Reply

Marsh Posté le 16-07-2002 à 13:09:38    

bon allez je fais péter l'exemple:
 
fichier infoframe.php

Code :
  1. <?
  2.   if ( isset($_GET['query']) && isset($_GET['tracker']) )
  3.    {
  4.      ?>
  5.        <script language="javascript">
  6.        top.stack[<?= $_GET['tracker'] ?>][0] = "done";
  7.        top.stack[<?= $_GET['tracker'] ?>][1] = "LE RESULTAT";
  8.        </script>
  9.      <?
  10.    }
  11. ?>


 
 
 
fichier contenu.php

Code :
  1. <html>
  2. <body>
  3. <form>
  4. <input type="button" onclick="top.getValue('test');">
  5. </form>
  6. </body>
  7. </html>


 
 
 
et le fichier particulierement intéressant:
 
fichier fs.php

Code :
  1. <html>
  2. <head>
  3. var stack = new Array();
  4. var current_position = 0;
  5. function getValue(what)
  6. {
  7.   stack[current_position][0] = "new";    //init de l'action
  8.   stack[current_position][1] = "";       // le résultat
  9.   info.location.href = "infoframe.php?query="+what+"&tracker="+current_position;
  10. /*
  11.   c là ou ya le blemz, fo ke je poirotte un moiment jusquà ce que info.location.href aie ramené les résultats attendus
  12. en gros l'algorithme que j'arrive pas à réaliser est:
  13. tant que  
  14.    stack[current_position][0] == "new" ,
  15. reste dans cette fonction sans retourner de valeur
  16. et dès que  
  17.    stack[current_position][0] == "done" ,
  18. retourne stack[current_position][1]
  19. */
  20. }
  21. </script>
  22. </head>
  23. <frameset rows="200,*">
  24. <frame name="info" src="infoframe.php">
  25. <frame name="contenu" src="contenu.php">
  26. </frameset>
  27. </html>


 
 
 
 
voilà si quelqu'un apprécie que je me défonce pour essayer d'ex^pliquer le blemz, c cool ;)


Message édité par k666 le 16-07-2002 à 13:25:59
Reply

Marsh Posté le 16-07-2002 à 14:40:32    

bon jsuis un peu fatigué donc jsuis pas sur d'avoir bien compris ton algo :)
 
mais a premiere vu c pas tres compliqué :)
tu creer une autre fonction qui est appelé dans infoframes.php lorsqu'il s'est chargé.
 
A premiere vue toi tu veux tout centralise dans ta fonction GetValue() qui parait initialisé ton array, ensuite doit attendre le retour d'une valeur, puis finir son code (pas forcement bien compris). Si cest le cas, tu fais un initGetValue() que tu lances au début et ensuite un GetValue() qui est lance par infoframes.php
 
mais bon dans ton cas tu peux faire passer les valeurs en parametres de fonction et non en passage hardcore de valeur entre formulaire (GetValue(blabla[0][1],blabla[0][2])) ce qui rendra ton code plus lisible
 
bon jsais pas trop si j ai repondu en faite ;)

Reply

Marsh Posté le 16-07-2002 à 14:58:43    

bin t'as essayé c'est gentil quand même :) mais non ça répond pas trop à ma question :'(
 
disons:
 
ma fonction est appelée ....
 
elle recharge un frame en lui passant des paramètres...
ce frame en se chargeant renseinge des variables...
 
la fonction lit ces variables et retourne la valeur.
 
c'est ce que j'essaye de faire, mais je vois pas du tout :(
 
j'ai essayé de cette façon:
je recharge la frame,
je fais un while pendant un certain temps,
je renvoie la valeur ....
 
 
le problème est que pendant ce while, la frame s'étant chargé n'arrive à rien faire car le frameset est occupé :( donc c pas multithreadé ... et c'est pour ça qu'il faut que je mette des setTimeouts ou je saios pas autre chose peut être
 
silvous plait, aidez moi, je suis désespéré et commence à penser qu'il n'y a aucune solution et donc jeter tout mon taf à la poubelle :(

Reply

Marsh Posté le 16-07-2002 à 15:13:29    

mouais ok, je vois :)
 
en faite c pas complique et ca peut meme etre marrant =)
 
dans fs.php, tu fout un
 
while d'attente de type :
 
while (attente)
{}
 
avec var attente = FALSE;
 
et dans infoframe.php, une fois que tu as lu tes infos, tu fous un top.attente(.value) = TRUE;
 
et la ton code continue.
 
oublie pas de mettre attente a FALSE apres :)
 
 
donc en gros cela donne :
 
infoframe.php :
 
<?
 
 if ( isset($_GET['query']) && isset($_GET['tracker']) )
 {
  ?>
   <script language="javascript">
   top.stack[<?= $_GET['tracker'] ?>][0] = "done";
   top.stack[<?= $_GET['tracker'] ?>][1] = "LE RESULTAT";
   top.attente = TRUE;
   </script>
  <?
 }
 
?>
 
 
et fs.php :
<html>
<head>
var stack = new Array();
var current_position = 0;
var attente = FALSE;
 
function getValue(what)
{
 
 stack[current_position][0] = "new";   //init de l'action
 stack[current_position][1] = "";    // le résultat
 
 info.location.href = "infoframe.php?query="+what+"&tracker="+current_position;
 
 while(attente)
  {}
 attente = FALSE;
 
//ici mon code apres le chargement de mon autre frame
}
</script>
</head>
<frameset rows="200,*">
<frame name="info" src="infoframe.php">
<frame name="contenu" src="contenu.php">
</frameset>
</html>

Reply

Marsh Posté le 16-07-2002 à 15:27:04    

euh
en fait okaie je fais comme tu dis;
je mets un flag en_attente à TRUE,
après je fais un  
 
while(en_attente)
   {}
 
 
 
pis l'autre frame, en se chargeant, modifie ce flag qui est une variable globale en faisant un top.en_attente = false;
 
mais ça marche pas, paske vu qu'il y a un WHILE qui a la main, le code top.en_attente = false; n'arrive jamais à s'exécuter ....
 
 
ce qui m'a ralenti mon navigateur :(

Reply

Marsh Posté le 16-07-2002 à 15:59:09    

bha ca c est sur que cela va le ralentir ton navigateur ... bon autre solution,
 
a la place de ton while, tu arrete ta fonction et tu lance un fonction autoappele avec un settimeout
 
donc en gros tu as dans fs.php :
 
 
<html>
<head>
var stack = new Array();
var current_position = 0;
var en_attente = FALSE;
 
function getValue(what)
{
 
stack[current_position][0] = "new";  //init de l'action
stack[current_position][1] = "";   // le résultat
 
info.location.href = "infoframe.php?query="+what+"&tracker="+current_position;
 
attente();
}
 
function attente()
{
 if (!en_attente)
 {
  setTimeOut(attente(),letempsquetuveux)
 }
 else
 {
  //la suite de ton code qui etait dans getValue()
 }
}
</script>
 
[tronked]
 
le settimeout doit liberer les ressources et te permettre d'executer ce que tu veux. A toi de le mettre de maneire assez eleve.
 
 
SINON
 
autre solution :)
 
tu defini dans ton infoframes.php les parametres, et tu les fait lire en continue via la function attente.
 
Enfin, dans ton while, mais eventuellement une delay, la ressource processeur pourra surement reprendre la main

Reply

Marsh Posté le 16-07-2002 à 16:56:12    

ou sinon alors: autre possibilité:
 
ya til une façon de mettre une fonction en sleep ? et de la réveiller sur un évènement (par exemple changement de la valeur d'une variable) ???
 

Reply

Marsh Posté le 16-07-2002 à 17:32:12    

vi :)
 
sur le changement d'une variable non mais sur le déplacement de la souris ou un truc comme ca oui (enfin pour le changement d'une variabel il faudrait voir)
 
me rappelle plus exactement comment cela s ecrit, il faudrait que tu regardes de la doc a ce sujet la
 
c un truc a l init du genre :
 
cequejattends.event = mafonction();

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed