Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les 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
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 :
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
Shargat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2009, 16h04   #2
Membre confirmé
 
Avatar de nod__
 
Étudiant
Inscription : 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
Points : 208
Points : 208
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 00
Vieux 29/06/2009, 16h19   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 :
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

Dernière modification par Shargat ; 29/06/2009 à 16h32.
Shargat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2009, 09h09   #4
Modérateur
 
Avatar de DoubleU
 
Inscription : janvier 2006
Messages : 1 107
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 1 107
Points : 1 167
Points : 1 167
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 00
Vieux 30/06/2009, 10h33   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 00
Vieux 30/06/2009, 10h56   #6
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 037
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2007
Messages : 9 037
Points : 14 651
Points : 14 651
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 00
Vieux 30/06/2009, 11h01   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 00
Vieux 30/06/2009, 11h04   #8
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 037
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2007
Messages : 9 037
Points : 14 651
Points : 14 651
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 00
Vieux 30/06/2009, 11h08   #9
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 00
Vieux 30/06/2009, 11h14   #10
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 037
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2007
Messages : 9 037
Points : 14 651
Points : 14 651
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 00
Vieux 30/06/2009, 11h30   #11
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 00
Vieux 30/06/2009, 11h37   #12
Expert Confirmé
 
Avatar de franculo_caoulene
 
Inscription : octobre 2003
Messages : 2 886
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2 886
Points : 2 559
Points : 2 559
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 00
Vieux 30/06/2009, 11h50   #13
Candidat au titre de Membre du Club
 
Inscription : janvier 2008
Messages : 77
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 77
Points : 12
Points : 12
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 00
Vieux 30/06/2009, 12h08   #14
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 037
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : janvier 2007
Messages : 9 037
Points : 14 651
Points : 14 651
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 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 19h34.


 
 
 
 
Partenaires

Hébergement Web