Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire Cours JavaScript, FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 29/06/2009, 15h55   #1 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
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 :
 
//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
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 29/06/2009, 16h04   #2 (permalink)
Membre habitué
 
Avatar de nod__
 
Date d'inscription: avril 2009
Localisation: Lille
Messages: 162
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.
nod__ est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 29/06/2009, 16h19   #3 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
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 :
//##################################################################################"
    //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

Dernière modification par Shargat ; 29/06/2009 à 16h32.
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 09h09   #4 (permalink)
Modérateur
 
Avatar de DoubleU
 
Date d'inscription: janvier 2006
Localisation: Crawford, Texas
Messages: 1 028
Par défaut

Je pense que c'est plutot l'autre partie que tu devrais montrer, celle qui appele les web services.
Citation:
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)
DoubleU est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 10h33   #5 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
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 :
 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é)
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 10h56   #6 (permalink)
Modérateur
 
Date d'inscription: janvier 2007
Messages: 7 459
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+
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h01   #7 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
Par défaut

Bah la question porte côté client. Le code C# est totalement indépendant.
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h04   #8 (permalink)
Modérateur
 
Date d'inscription: janvier 2007
Messages: 7 459
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+
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h08   #9 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
Par défaut

Oui mais l'instruction qui gère cela est côté client :

Code :
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#.
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h14   #10 (permalink)
Modérateur
 
Date d'inscription: janvier 2007
Messages: 7 459
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+
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h30   #11 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
Par défaut

Bon bah tant pis, je pensais que PageMethods était un objet Javascript.
Désolé
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h37   #12 (permalink)
Expert Confirmé Sénior
 
Avatar de franculo_caoulene
 
Date d'inscription: octobre 2003
Messages: 2 903
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.
__________________
Penser à la recherche et au bouton

Dernière modification par franculo_caoulene ; 30/06/2009 à 11h53.
franculo_caoulene est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 11h50   #13 (permalink)
Nouveau membre du Club
 
Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
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.
Shargat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/06/2009, 12h08   #14 (permalink)
Modérateur
 
Date d'inscription: janvier 2007
Messages: 7 459
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+
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation
NEWS JAVASCRIPTF.A.Q JSTUTORIELS JSSOURCES JSLIVRES JS

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 22h04.


Vos questions techniques : forum d'entraide JavaScript - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.