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 :

Accumulation de variables à l'appel d'une méthode Javascript (PILES ?)


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut Accumulation de variables à l'appel d'une méthode Javascript (PILES ?)
    Bonjour.

    Ce n'est pas facile à expliquer donc voici de suite le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //exécution d'une webmethod plusieurs fois de suite
    for (j =0; j <= i; j++)
    {
            PageMethods.Translate(selectedWordsTab[j], storeTranslation);
    }
     
    //seconde fonction Javascript appelée à la fin de l'exécution de la webmethod
    function storeTranslation(value)
        {
            alert(value):
        }

    Voilà, j'ai une boucle javascript dans laquelle j'apelle une webmethod qui va s'exécuter côté serveur et qui va ensuite appeler l'exécution d'une autre fonction Javascript.
    Dans l'exécution actuelle je constate que toutes les itérations de ma boucle s'exécutent de suite sans laisser le temps à la seconde méthode Javascprit de s'exécuter.

    Résultat, l'affichage dans la seconde fonction Javascript est inversé. Je présume que c'est dû au fait que les variables value renvoyée par la webmethod s'accumulent dans une pile de type LIFO. Pour changer la donne, il me faudrait une pile FIFO.

    Je ne sais pas comment fonctionne tout ceci en Javascript alors est-il possible de changer cela pour réordonner les variables value sans avoir à les stocker ?

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    Si j'ai bien compris, le problème c'est que tu fais un appel a ton serveur par AJAX, et que tu exécute tous les appels à la suite, sans attendre le retour de la requete avant d'executer l'itération suivante.

    Enfin bref, il n'y a pas assez de code pour savoir ce qui se passe. Il n'y a pas de piles en JS, donc LIFO, FIFO… il faut le reste du programme js pour dire ce qu'il faut faire.

    Remarque que si t'as un tableau, un tonTableau.reverse(); peut faire l'affaire.

  3. #3
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    Le retour de la requête se fait dans la seconde fonction Javascript.
    Cela dit j'aimerai bien attendre la fin de l'exécution de la webmethod avant de faire l'itération suivante mais je ne pense pas que ce soit faisable. Je présume qu'un thread spécifique est créé pour exécuter la webmethod ...

    Le code que j'ai mis là est le code utile, le reste ne joue pas dans cette problématique mais si tu insistes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //##################################################################################"
        //display the words and translations in dynamic lines
        function storeTranslation(value)
        {
            var result;
            if (value == "")
                result = "The word does not exist";
            else result = value;
    	    document.getElementById('dynamic_part').innerHTML = document.getElementById('dynamic_part').innerHTML + "<label><strong>"+selectedWordsTab[nbWords]+"</strong></label> Translation : <strong><label>"+result+"</label></strong><br/>";
     
         document.getElementById('hidden_part').innerHTML = document.getElementById('hidden_part').innerHTML + "<input type='text' id="+nbWords+" value='"+result+"'/>";
         document.getElementById('hidden_part').innerHTML = document.getElementById('hidden_part').innerHTML +" <input type='button' value='Add/Edit the translation' onclick='setTranslation(\""+selectedWordsTab[nbWords]+"\", document.getElementById(\""+nbWords+"\").value);'/>";  
            nbWords = nbWords + 1;
        }
    La boucle elle est indépendante.
    Il apparait que ces lignes créées dynamiquement sont inversées par rapport à l'ordre d'appel de la webmethod

  4. #4
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    Je pense que c'est plutot l'autre partie que tu devrais montrer, celle qui appele les web services.
    Cela dit j'aimerai bien attendre la fin de l'exécution de la webmethod avant de faire l'itération suivante mais je ne pense pas que ce soit faisable. Je présume qu'un thread spécifique est créé pour exécuter la webmethod ...
    A priori oui, si tu utilises l'objet xmlhttprequest, les appels sont (normalement) asychrones, c'est à dire threadés.

    Deux solutions à priori:
    - passer ton appel ajax en synchrone (mauvaise solution)
    - attendre que l'appel au web service soit terminé (réponse reçue) pour envoyer le suivant (bonne solution)

  5. #5
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    Bonjour
    Je n'utilise pas xmlhttprequest (ou alors implicitement). La webmethod est en C#.
    Elle est donc appelée par cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     PageMethods.Translate(selectedWordsTab[j], storeTranslation);
    La méthode C# Translate() fait tout un tas d'instructions et retourne un string qui devient argument de la méthode Javascript storeTranslation().
    C'est typiquement l'utilisation de webmethod C# en Javascript. Donc je ne vois pas comment vérifier la fin d'exécution de ma webmethod.

    (arf du coup j'aurais peut-être dû posté dans AJAX...désolé)

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par Shargat Voir le message
    (arf du coup j'aurais peut-être dû posté dans AJAX)
    Ou C# plutôt, non ?

    A+

  7. #7
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    Bah la question porte côté client. Le code C# est totalement indépendant.

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par Shargat Voir le message
    Le code C# est totalement indépendant.
    Ben, c'est lui qui gère l'échange Ajax, on dirait (si Ajax il y a ...)
    Citation Envoyé par Shargat Voir le message
    La méthode C# Translate() fait tout un tas d'instructions et retourne un string qui devient argument de la méthode Javascript storeTranslation().
    A+

  9. #9
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    Oui mais l'instruction qui gère cela est côté client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PageMethods.Translate(selectedWordsTab[j], storeTranslation);
    Je ne sais pas comment l'objet PageeMethods est construit mais c'est lui qui jongle entre le Javascript et le C#. Ma méthode C# ne demande rien à personne et renvoie un string qui pourrait tout aussi bien être récupéré par une autre méthode C#.

  10. #10
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par Shargat Voir le message
    Je ne sais pas comment l'objet PageeMethods est construit mais c'est lui qui jongle entre le Javascript et le C#. Ma méthode C# ne demande rien à personne et renvoie un string qui pourrait tout aussi bien être récupéré par une autre méthode C#.
    Ce qui commence à faire beaucoup de questions sur C#, auxquelles il seraient peut être intéressant d'avoir une réponse, non ?
    Par exemple, savoir si les appels Ajax sont gérés en synchones ou asynchrone (ça semble être le 2°) ?
    Comment est gérée la pile de réponses ?

    Ce ne sont pas des questions "JavaScript" (ni même Ajax, puisque ce n'est pas ton code qui gère ces problèmes directement).

    A+

  11. #11
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    Bon bah tant pis, je pensais que PageMethods était un objet Javascript.
    Désolé

  12. #12
    Membre Expert Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Par défaut
    Je me disais bien que "Webmethod" me disait quelque chose! Le deuxième argument de la méthode est la fonction à appeler en cas de succès. Boucler directement sur Translate c'est oublier le caractère asynchrone d'Ajax.
    Il faut plutôt l'appeler de nouveau dans storeTranslation.

  13. #13
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2008
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2008
    Messages : 138
    Par défaut
    AH mais oui bien sûr. La voilà la solution.
    De cette façon je contrôle l'ordre d'exécution et je passe outre le caractère asynchrone.
    Merci bien pour votre aide.

  14. #14
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Citation Envoyé par Shargat Voir le message
    De cette façon je contrôle l'ordre d'exécution et je passe outre le caractère asynchrone.
    Non : tu le gères correctement

    A+

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/02/2012, 17h15
  2. [script.aculo.us] Appel d'une méthode javascript sur le callback onUpdate
    Par thibane dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 02/04/2008, 11h33
  3. Appel d'une méthode via une variable.
    Par seiryujay dans le forum Général Java
    Réponses: 7
    Dernier message: 14/11/2006, 09h56
  4. Réponses: 6
    Dernier message: 27/05/2005, 15h43
  5. Comment connaitre l'appelant d'une méthode
    Par Alec6 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/07/2004, 14h51

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