Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1058 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°176596
k666
dites non à petitmou
Posté le 15-07-2002 à 18:58:25  profilanswer
 

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
mood
Publicité
Posté le 15-07-2002 à 18:58:25  profilanswer
 

n°176603
youdontcar​e
Posté le 15-07-2002 à 19:03:49  profilanswer
 

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.

n°176605
k666
dites non à petitmou
Posté le 15-07-2002 à 19:05:42  profilanswer
 

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..
  }
}
 
}

n°176608
--greg--
Posté le 15-07-2002 à 19:09:28  profilanswer
 

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!
n°176609
k666
dites non à petitmou
Posté le 15-07-2002 à 19:10:02  profilanswer
 

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

n°176610
youdontcar​e
Posté le 15-07-2002 à 19:10:47  profilanswer
 

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 ?

n°176627
k666
dites non à petitmou
Posté le 15-07-2002 à 19:34:25  profilanswer
 

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 ?

n°176631
fripouille
Posté le 15-07-2002 à 19:36:12  profilanswer
 

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

n°176636
k666
dites non à petitmou
Posté le 15-07-2002 à 19:42:22  profilanswer
 

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

n°176637
k666
dites non à petitmou
Posté le 15-07-2002 à 19:43:36  profilanswer
 

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 ...

mood
Publicité
Posté le 15-07-2002 à 19:43:36  profilanswer
 

n°176642
youdontcar​e
Posté le 15-07-2002 à 19:57:04  profilanswer
 

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 !

n°176646
k666
dites non à petitmou
Posté le 15-07-2002 à 20:02:52  profilanswer
 

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" );

n°176647
youdontcar​e
Posté le 15-07-2002 à 20:07:40  profilanswer
 

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.

n°176657
--greg--
Posté le 15-07-2002 à 20:37:44  profilanswer
 

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 :/

n°176695
k666
dites non à petitmou
Posté le 15-07-2002 à 22:24:30  profilanswer
 

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


Message édité par k666 le 15-07-2002 à 22:24:50
n°176697
k666
dites non à petitmou
Posté le 15-07-2002 à 22:29:51  profilanswer
 

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
n°176822
k666
dites non à petitmou
Posté le 16-07-2002 à 10:03:39  profilanswer
 

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

n°176842
froggycorp
Posté le 16-07-2002 à 10:32:57  profilanswer
 

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

n°176917
k666
dites non à petitmou
Posté le 16-07-2002 à 11:18:44  profilanswer
 

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
n°176960
froggycorp
Posté le 16-07-2002 à 12:05:20  profilanswer
 

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 ;) )

n°176987
k666
dites non à petitmou
Posté le 16-07-2002 à 12:42:21  profilanswer
 

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  
 

n°176992
k666
dites non à petitmou
Posté le 16-07-2002 à 12:46:08  profilanswer
 

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:  

n°176996
k666
dites non à petitmou
Posté le 16-07-2002 à 12:49:53  profilanswer
 

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 ....

n°177011
k666
dites non à petitmou
Posté le 16-07-2002 à 13:09:38  profilanswer
 

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
n°177079
froggycorp
Posté le 16-07-2002 à 14:40:32  profilanswer
 

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 ;)

n°177109
k666
dites non à petitmou
Posté le 16-07-2002 à 14:58:43  profilanswer
 

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 :(

n°177125
froggycorp
Posté le 16-07-2002 à 15:13:29  profilanswer
 

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>

n°177145
k666
dites non à petitmou
Posté le 16-07-2002 à 15:27:04  profilanswer
 

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 :(

n°177193
froggycorp
Posté le 16-07-2002 à 15:59:09  profilanswer
 

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

n°177244
k666
dites non à petitmou
Posté le 16-07-2002 à 16:56:12  profilanswer
 

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) ???
 

n°177275
froggycorp
Posté le 16-07-2002 à 17:32:12  profilanswer
 

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();

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
[ACCESS] fonction datela fonction mail () en local marche elle ?
[PHP] Je vais devenir fou avec cette fonction addslashesla fonction mail() est-elle desactivée sur Multimania ?
[C++] Pointeur de fonction sur membre d'une classeune fonction vbscript ne peut elle pas retourner un objet recordset??
[PHP] savoir si une fonction existeattendre la fin d'une requete ??
[C++] sous unix, O_TEXT (fonction open())[C] Existe t'il une fonction équivalente à explode ?
Plus de sujets relatifs à : [JS] faire 'attendre' le return d'une fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR