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 :

[DWR][JavaScript] Plusieurs appels asynchrones et un seul callback


Sujet :

JavaScript

  1. #1
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut [DWR][JavaScript] Plusieurs appels asynchrones et un seul callback
    Bonjour à tous.

    Voilà la situation.
    Je fais des appels DWR successifs (1, 2 jusqu'à 5 admettons) pour récupérer des donnéesc côté serveur et mettre à jour des tableaux.
    Je me suis arrangé pour faire "proprement" et n'utiliser qu'une seule fonction callback, car elle fait tout le temps la même chose.
    Pour ça, j'utilise des closures dans mes appels, notamment pour pouvoir conserver des paramètres clients dans mon callback et les utiliser dans mon traitement (vParamsJS).
    Je n'ai donc qu'une seule fonction (majListe) qui doit être appelée au retour de chaque appel serveur.

    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
     
    // Appel 1
    DWR.methode1(param1, {
    	callback: function(pDonneesDuServeur){
    		majListe(pDonneesDuServeur, vParamsJS);
    	},
    	errorHandler: function(errorString, exception) { traitement...});
    });
     
    // Appel 2
    ...
     
    // Appel 3
    ...
     
    function majListe(pDonneesDuServeur, pParamsJS){
    ....
    }
    Le souci avec ce code, c'est qu'au fur et à mesure que les appels DWR renvoient leur réponse, ils rentrent tous dans le même callback (majListe) et les données s'écrasent. Au final, aucune liste n'est mise à jour.

    Je suis parti ensuite sur l'idée de créer des instances différentes de majListe : une instance par appel DWR. J'ai donc passé la fonction en attribut d'un objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function majListeAccueilCallbackFactory(pListeResultat, pParamsJS){
    	this.listeResultat = pListeResultat;
    	this.paramsJS = pParamsJS;
    	var that = this;
    	this.majListe = function(){
    		traitement qui utilise les référence à that...
    		}
    	}
    }
    Mon appel devient alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Appel DWR
    DWR.methode1(param1, {
    	callback: function(pDonneesDuServeur){
    		var obj = new majListeAccueilCallbackFactory(pDonneesDuServeur, vParamsJS);
    		obj.majListe(); 
    	},
    	errorHandler: function(errorString, exception) { traitement... }
    });
    Problème, ça ne fonctionne toujours pas. Même symptôme, j'ai l'impression que le 2ème appel écrase les données serveur ce qui provoque le crash de la mise à jour de la 1ère liste.
    J'en fais appel à vous parce que là je suis un peu à cours de solution!

    PS : la solution de créer autant de callback que d'appel fonctionne, mais comme j'ai potentiellement 25 appels différents, ça me dérange un peu d'écrire 25 callback identiques...

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    stocker les fonctions dans un array lors de leur instanciation avec new ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    En fait je pense avoir compris d'ou vient le problème.

    Comme je le disais, je crée une variable vParamsJS pour chaque appel.
    Ma fonction se présente comme suit :

    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
     
    function maFonction(){
     
    sswitch(v){
       case 'x' : 
          var vParamsJS = {...};
          appel DWR 1
          break;
       case 'y' : 
          var vParamsJS = {...};
          appel DWR 2
          break;
       ...
    }
    }
    Donc finalement je pense que c'est une histoire de portée.
    Visiblement, vParamsJS tel que je l'ai écrit semble être de portée globale au lieu d'être locale au case. Donc au fur et à mesure des switch, ma variable est écrasée (et du coup le traitement effectuée plus loin dans le callback incohérent)

    Par contre, je n'arrive pas à savoir si c'est bien :
    => le problème de portée de vParamsJS qui est globale (au lieu de locale au case comme je le pensais)
    => ou alors un effet de bord de la closure que je forme en déclarant le callback DWR
    Visiblement, je m'emmêle les pinceaux avec les différentes portées..

Discussions similaires

  1. Appel simultané de plusieurs EJB Asynchronous : crash de Glassfish
    Par ZouBi dans le forum Glassfish et Payara
    Réponses: 0
    Dernier message: 04/03/2013, 10h48
  2. récupération variable avec plusieurs appels Javascript
    Par aikiox dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/04/2012, 17h38
  3. Javascript généré par appel asynchrone
    Par bor1s dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 09/01/2012, 17h05
  4. Appel de plusieurs pages .js, mais une seule exécutée.
    Par andyroddick dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 02/07/2010, 16h17
  5. Appel Asynchrone/Synchrone
    Par Dry dans le forum CORBA
    Réponses: 3
    Dernier message: 26/04/2005, 20h43

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