IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

exécution de fonction


Sujet :

JavaScript

  1. #1
    Membre actif Avatar de MANU_2
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 417
    Points : 275
    Points
    275
    Par défaut exécution de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function affiche ()
    {	
    	aff_qt();
    	//alert('ty');
    	calcul_qt("ajout");
    }
    Que je met "alert", la fonction calcul_qt revoie la bonne valeur.
    Mais sans "alert", la fonction calcul_qt revoie une valeur erronée.

    aff_qt modifie une valeur que doit utiliser calcul_qt.
    J'ai l'impression que les 2 fonctions s'exécute en même temps et donc calcul_qt va plus vite que aff_qt.
    Ai je raison ?

    Y a-t-il un moyen de faire en sorte que calcul_qt s'exécute quand aff_qt a fini ?

    Merci

  2. #2
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut Re: exécution de fonction
    Citation Envoyé par MANU_2
    J'ai l'impression que les 2 fonctions s'exécute en même temps et donc calcul_qt va plus vite que aff_qt.
    Ai je raison ?

    Y a-t-il un moyen de faire en sorte que calcul_qt s'exécute quand aff_qt a fini ?
    Les deux fonctions s'executent sequentiellement (l'une après l'autre). Donc calcul_qt attends bien que aff_qt ait fini de s'executer. Mais le fait qu'elle est finie de s'executer ne veux pas dire qu'elle ne vas plus rien faire.

    Tout dépends de ce que tu as dans la fonction aff_qt... Si il y a la moindre partie de code asynchrone, dans ce cas, c'est normal que tu observes le problème que tu décris.

    Tu peux nous montrer le code de aff_qt si il n'est pas trop long?

  3. #3
    Membre actif Avatar de MANU_2
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 417
    Points : 275
    Points
    275
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function aff_qt()
    {	  														 
    	/* Création de l'objet : */
    	var xmlhttp = getHTTPObject(); 
     
    	/* Préparation d'une requête asynchrone de type POST : */
    	xmlhttp.open("POST", "qt_restant.php", true);		  
     
    	/* Effectue la requête en envoyant les données : */	 
    	var data = "qt="+document.formu.couleur.value;	
    	xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    	xmlhttp.send(data); 
    }
    Une parti de :
    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
    function calcul_qt(action)
    {	
    	if (action == "ajout")  // ajout ==>  stock - nécessaire
    	{  
    		if (document.formu.qantrest.value > 0)
    		{
    			var qt = document.formu.qantrest.value - document.formu.quantite.value;   
    			if (qt<=0)
    			{		     
    				cacher("danger", "voir");
    				document.formu.danger.value = " Attention, votre stock est épuisé : " + qt;	   
    			}
    			else
    			{	   
    				cacher("danger" , "");
    			}
    		}
    		else
    		{	
    			cacher("danger", "voir"); 
    			document.formu.danger.value = " Attention, votre stock est déjà épuisé ";	 
    		}		
    	}

  4. #4
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par MANU_2
    xmlhttp.open("POST", "qt_restant.php", true);
    Voila, typiquement, xmlHttpRequest est un objet asynchrone. Il ne bloque pas le navigateur pendant son execution, et d'autres fonctions peuvent donc être appellée.

    Pour résumer:
    Au moment de ton
    xmlhttp.send(data);
    La requete POST est envoyé, et la fonction est considérée comme terminé. JS passe donc à l'execution de ta fonction suivante, sans aucune garantie que ta requete ait été reçue ou traitée par le serveur.
    D'ou le problème que tu observes.

    Documentes toi un peu sur XmlHttpRequest pour voir comment executer du code lors du retour de la requete.

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 361
    Points : 15 709
    Points
    15 709
    Par défaut
    pour règler ça tu peux utiliser une simple balise "script" pour ta fonction "aff_qt"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function aff_qt()
    {	  														 
    	var scriptQtRestant = document.createElement('script'); 
    	scriptQtRestant.setAttribute('src', 'qt_restant.php?qt' + traiteValeurUrl(document.formu.couleur.value));
     
    	// insertion de la balise dans le body pour lancer l'exécution
    	document.body.appendChild(scriptQtRestant);
    }
     
    function traiteValeurUrl(valeur)
    {
    	var resultat = escape(valeur);
    	return resultat.replace(/\+/g, '%2B');
    }
    comme ça la fonction s'arretera quand le script "qt_restant.php" sera terminé

  6. #6
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par mathieu
    pour règler ça tu peux utiliser une simple balise "script" pour ta fonction "aff_qt"

    comme ça la fonction s'arretera quand le script "qt_restant.php" sera terminé
    Euh, c'est moi ou cette solution est-elle éminemment sale?

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 361
    Points : 15 709
    Points
    15 709
    Par défaut
    Citation Envoyé par denisC
    Euh, c'est moi ou cette solution est-elle éminemment sale?
    pardon ? tu pourrais développer ?

  8. #8
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par mathieu
    pardon ? tu pourrais développer ?
    Ben il me semble qu'ecrire dans le document une balise script pour executer un page php c'est sale, quand on sait que xmlHttpRequest sert très justement à ça (appeller une page via javaScript).

    De plus, une balise script qui appellerai une page php, ça me parait plus que questionnable....

    Enfin, dans l'optique de séparation contenu/traitement/présentation et tout et tout. Je ne doute pas que ça marche très bien, mais je ne vois vraiment pas l'interet d'ecrire une balise script dans le document, quand XmlHttprequest est justement là pour ça.

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 361
    Points : 15 709
    Points
    15 709
    Par défaut
    Citation Envoyé par denisC
    Enfin, dans l'optique de séparation contenu/traitement/présentation et tout et tout. Je ne doute pas que ça marche très bien, mais je ne vois vraiment pas l'interet d'ecrire une balise script dans le document, quand XmlHttprequest est justement là pour ça.
    il y a plusieurs interêts à cette technique :
    - elle n'est pas aussi lourde que la mise en place de XmlHttprequest s"il n'y a pas de traitement asynchrone à faire
    - elle fonctionne sur un plus grand nombre de navigateur que XmlHttprequest
    - la quantité de données en retour est réduite par rapport à XmlHttprequest ce qui economise du temps de transfert
    - on peut directement retourner des objet JavaScript ce qui économise le temps le parsage de l'XML coté client

    et pour la séparation traitement/données/présentation, comme c'est la cas pour XmlHttprequest, seules des données transitent

  10. #10
    Membre actif Avatar de MANU_2
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 417
    Points : 275
    Points
    275
    Par défaut
    Avec ceci en +, ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    xmlhttp.onreadystatechange = retour; 
    ...
    	/* Traitement du retour */	
    	function retour ()
    	{
    		if (xmlhttp.readyState == 4) 
    		{	
    			document.formu.qantrest.value = xmlhttp.responseText;
    			calcul_qt(action);
    		} 
    	}

  11. #11
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par mathieu
    - elle n'est pas aussi lourde que la mise en place de XmlHttprequest s"il n'y a pas de traitement asynchrone à faire
    - elle fonctionne sur un plus grand nombre de navigateur que XmlHttprequest
    - la quantité de données en retour est réduite par rapport à XmlHttprequest ce qui economise du temps de transfert
    - on peut directement retourner des objet JavaScript ce qui économise le temps le parsage de l'XML coté client
    • Euh, XmlHttpRequest est quand même pas si lourd que ça....
    • C'est vrai, mais ce n'est pas une raison valable (pour moi)
    • Je vois pas ce qui est réduit comme quantité de données
    • On peut aussi avec XmlHttpRequest (cf Google Suggest)


    Donc je ne suis pas convaincu, mais je suppose que tu n'es pas convaincu non plus Donc chacun sa technique ^^

  12. #12
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 361
    Points : 15 709
    Points
    15 709
    Par défaut
    Citation Envoyé par denisC
    Donc je ne suis pas convaincu, mais je suppose que tu n'es pas convaincu non plus Donc chacun sa technique ^^
    il n'y a pas à être convaincu d'une technique ou de l'autre, chacune a ses utilisations. ce qui m'exaspère c'est qu'on utilise XmlHttpRequest pour tout et n'importe quoi

    Citation Envoyé par denisC
    Je vois pas ce qui est réduit comme quantité de données
    si tu veux retourner vrai ou faux par exemple, avec XmlHttpRequest tu auras ça que tu devra ensuite analyser en envoyer à la bonne fonction JavaScript:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <?xml version="1.0"?>
    <retour>0</retour>
    tandis qu'avec la balise "script" dynamique tu envoies simplement ça :
    Citation Envoyé par denisC
    (cf Google Suggest)
    je n'ai pas trouvé de quoi tu parles, tu aurais un lien ?

  13. #13
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par mathieu
    <?xml version="1.0"?>
    <retour>0</retour>
    Tu n'es pas du tout obligé de faire du Xml dans une requete XmlHttpRequest. Tout comme dans ton exemple, tu peux renvoyer simplement une chaine de caractère (false par exemple) et te contenter de l'evaluer en JS avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    eval(httpReq.responseText);
    C'est ce que Google Suggest utilise, comme expliqué dans cet article

    What gets sent back looks like this:

    sendRPCDone(frameElement, "fast bug", new Array("fast bug track", "fast bugs", "fast bug", "fast bugtrack"), new Array("793,000 results", "2,040,000 results", "6,000,000 results", "7,910 results"), new Array(""));
    Le retour est une instruction JavaScript, pas du tout un XML correctemente formatté...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant]Comment exécuter une fonction tous les jours
    Par pseudomh dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/06/2006, 16h10
  2. Exécuter une fonction sur le onchange d'un select
    Par Lung dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 20/06/2006, 15h05
  3. Réponses: 5
    Dernier message: 28/04/2006, 14h40
  4. Est-il possible d'exécuter une fonction à partir de fichier
    Par magic8392 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 16/09/2005, 13h59
  5. [VB.NET] Exécuter une fonction VB sur un Datagrid
    Par MiJack dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/09/2004, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo