|
Publicité | ||||||||||||||||||||||
|
|
#1 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
|
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 |
|
|
|
|
|
#2 (permalink) |
|
Membre habitué
![]() Date d'inscription: avril 2009
Localisation: Lille
Messages: 162
|
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 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
|
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; } 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. |
|
|
|
|
|
#4 (permalink) | |
![]() Date d'inscription: janvier 2006
Localisation: Crawford, Texas
Messages: 1 028
|
Je pense que c'est plutot l'autre partie que tu devrais montrer, celle qui appele les web services.
Citation:
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 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
|
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); 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é) |
|
|
|
|
|
#9 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: janvier 2008
Localisation: Edinburgh (Scotland)
Messages: 77
|
Oui mais l'instruction qui gère cela est côté client :
Code :
PageMethods.Translate(selectedWordsTab[j], storeTranslation); |
|
|
|
|
|
#10 (permalink) | |
![]() Date d'inscription: janvier 2007
Messages: 7 459
|
Citation:
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+ |
|
|
|
|
|
|
#12 (permalink) |
|
Expert Confirmé Sénior
![]() Date d'inscription: octobre 2003
Messages: 2 903
|
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. Dernière modification par franculo_caoulene ; 30/06/2009 à 11h53. |
|
|
|
|
|
![]() |
||
Accumulation de variables à l'appel d'une méthode Javascript (PILES ?)
|
||
| Outils de la discussion | |
|
|