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

jQuery Discussion :

Pas de données après de multiples requêtes Ajax [AJAX]


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut Pas de données après de multiples requêtes Ajax
    Bonjour,

    Je développe une application JEE avec Tomcat 7. Sur une de mes pages web, après un clique sur un bouton, je lance un processus long via une requête Ajax ($.post). Une fois le processus terminé, il me retourne les données au format JSON et je mets à jour un tableau.

    Pendant ce processus qui peut durer un certain temps, je souhaite que l'utilisateur puisse toujours se promener sur la page. Par la, je veux dire qu'il puisse cliquer sur d'autres boutons, qui lancent eux aussi des requêtes Ajax, en attendant que le processus long se termine. Ces autres requêtes sont très rapides, elles ne font que me retourner des données pour de l'affichage.

    Le problème quand je fais ça (cliquer sur les autres lanceurs de requêtes Ajax), c'est qu'une fois que la procédure longue est terminée, les données retournées sont vide. Ce qui n'est pas le cas si je ne touche à rien après avoir lancée la procédure longue.

    Voilà à quoi ressemble de type de requête que j'envoie (classique, vous me direz):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $.post("envs/clear", { idEnv: id }, function(data) {
    	console.log(data);
    	// traitements
    	// mise à jour du tableau
    });
    Toutes mes requêtes sont comme ça.
    Niveau Java, j'appelle une fonction aussi simple que ça à la fin de mes fonctions (c'est vraiment à titre informatif, car je sais que ce forum n'est pas à propos du java) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void renderJSON(Object obj)
    {
    	try
    	{
    		resp.setContentType("text/json");
    		resp.getWriter().write(StringUtils.toJSON(obj));
    	}
    	catch (IOException e)
    	{
    		e.printStackTrace();
    	}
    }
    Voilà, j'aimerai savoir ce qui cause ce problème, et comment le résoudre ?

    Merci d'avance.

  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
    essaye de pusher tes requetes dans un array ?
    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 averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    essaye de pusher tes requetes dans un array ?
    Comment ça ?
    Que je les mette dans un array et que je les exécute une par une, telle une file ?
    Si c'est ça, certes ça marcherait, mais ce n'est plus de l'asynchrone et puis il faudra attendre que la fonction qui prenne du temps finisse avant que toutes les autres actions faites par l'utilisateur ne s’exécutent...

    Le truc, c'est que l'affichage du console.log de la méthode qui lance le traitement long, est bien le bon. Je n'ai donc pas l'impression que le résultat du traitement long est choppé par une autre requête Ajax.

  4. #4
    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
    qui te parle de file ????

    je te parle d'instances
    push tes post dans un array
    elle devraient alors recevoir une reponse distincte
    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 !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    J'ai essayé ta méthode (aussi surprenante soit elle pour moi), ça ne marche pas pour autant. En fait, je ne vois pas en quoi stocker le résultat du $.post dans un tableau permettra au programme de donner la réponse au bon "success".

    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
    var lstAjax = new Array(); // déclaré en début de script
     
    ...
     
    lstAjax.push($.post("env/clear", { envId: id }, function(data) {
    	// lstAjax se remplit bien avec l'ensemble des requêtes ajax ($.post & $.get) executées.
    	// data est vide si d'autres requêtes Ajax sont faites entre temps
    	console.log(data, lstAjax); 
    }));
     
    ...
     
    // exemple de requête que j'appelle pendant le traitement long
    $("#btnChangeEnv").click(function() {
    	lstAjax.push($.get("env/getEnv", { envId: id }, function(data) {
    		// traitement de data
    	}));
    });

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    J'ai trouvé le problème, il était côté Java finalement.

    Je m'étais créé un peu mon propre framework. Mes servlets hérite de Controller. Cette classe gère toutes les requêtes, voyez plutôt le début de la fonction service:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected HttpServletRequest req;
    protected HttpServletResponse resp;
     
    @Override
    public void service(ServletRequest rq, ServletResponse rp) throws ServletException, IOException
    {
    	this.req = (HttpServletRequest) rq;
    	this.resp = (HttpServletResponse) rp;
     
    	// plus loin, appel de la méthode demandée par POST ou GET
    Du coup, à chaque appel de la servlet (ajax for instance), resp est réécrit, donc si à un traitement ajax long s’ensuit d'un traitement ajax court, la réponse du traitement long a de forte de chance de perdre sa réponse. Finalement SpaceFrog, il va bien falloir que je gère un tableau, mais côté java (pour les HttpServletResponse)

    Merci pour les réponses.

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

Discussions similaires

  1. [AJAX] Décalage affichage div après actualisation via requête ajax
    Par E. Nigma dans le forum jQuery
    Réponses: 6
    Dernier message: 21/05/2015, 15h50
  2. Réponses: 0
    Dernier message: 21/08/2014, 10h10
  3. [AJAX] Empêcher envoi multiple requêtes ajax
    Par M4kn4sh dans le forum jQuery
    Réponses: 13
    Dernier message: 01/02/2013, 17h05
  4. [AJAX] Récupérer donnée après requête ajax
    Par airsoft28 dans le forum AJAX
    Réponses: 7
    Dernier message: 26/12/2012, 17h38
  5. [MooTools] Multiples requêtes Ajax et performances
    Par ALkyD dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 15/01/2008, 11h11

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