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 :

Fuite mémoire AJAX avec setTimeout


Sujet :

jQuery

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    DCS
    Inscrit en
    Août 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : DCS
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 12
    Par défaut Fuite mémoire AJAX avec setTimeout
    Bonjour,

    Je suis confronté a un pb de fuite de mémoire qui se produit à chaque appel de ma fonction ajax (jQuery) depuis un setTimeout.
    Ma fonction est du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function callAjax()
    $ajax(){
      complete : setTimeout(callAjax), 8000);
      //déclaration de var
     //code...
    J'ai limité la casse en rechargeant automatiquement la page toute les 30 minutes mais j'aimerai trouver une solution plus propre.

    D'avance, merci pour votre aide

  2. #2
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    ??
    setTimeout(callAjax), 8000);

    et de toutes façons utiliser un setTimeout dans une opération asynchrone est une mauvaise idée, surtout pour faire un appel récursif
    car les interpréteurs JavaScript créent une nouvelle instance mémoire qui n'est pas faite pour s’agrandir toute seule.

    Pour ce genre de problématique JavaScript offre une gestion de promesse =>https://developer.mozilla.org/fr/doc...lobaux/Promise

  3. #3
    Membre habitué
    Homme Profil pro
    DCS
    Inscrit en
    Août 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : DCS
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 12
    Par défaut promise ajax setTimeout et fuite mémoire
    Bonjour,

    Je viens de mettre en place une solution via promise de jQuery.
    Mon code est maintenant de la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var callAjax = $ajax({
    //mes paramètres ajax
    });
     
    var xmlAjax = fonction(xml) 
    //mon code équivalent a success
    //avec en fin mon setTimeout(fonction(){ //appel de xmlAjax() }); 
     
    callAjax.done(xmlAjax);
    Mon setTimeout ne fonctionne pas car il rappel le traitement de mon XML mais pas la relecture du fichier qui est contenu dans la variable callAjax.

    Qu'elle approche devrais-je avoir pour faire une relecture du fichier xml via Ajax sans avoir des fuites de mémoire ?

    D'avance merci pour votre aide.

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par défaut
    Bonjour,
    (...) sans avoir des fuites de mémoire ?
    il serait intéressant que tu nous en dises plus sur ces « fuites de mémoire » constatées.

  5. #5
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    Par défaut
    Bon...

    Plusieurs choses :

    tu aura toujours des problèmes de "fuite mémoire" en cherchant à faire des appels récursifs au travers de l'utilisation de ta fonction setTimeOut.
    parce qu'en réalité tu remplis une pile d'appels interminables sur laquelle l'interpréteur ne trouve aucune fin, et au bout d'un moment il détruit cette pile et abandonne tout ce qu'il y a dedans?

    si tu dois absolument lancer un processus de manière répétée sur ta page alors il faut utiliser la méthode setInterval avec son pendant clearInterval pour le stopper.

    L'autre probleme que tu as, c'est que visiblement ce processus que tu appelle de manière répétée fait un appel Ajax ce qui signifie qu'entre le moment de l'appel sur vers un serveur et sa réponse, il peut se passer un temps infini, il peut même se passer que le serveur, ben y réponde pas.

    Donc si entre temps un nouvel appel sur un nouveaux processus 'ajax' est lancé avant que le précédent n'ai eu sa réponse et vu que c'est forcément un processus impactant toujours les mêmes éléments de ta page ben la aussi évidement tu va trouver que t'a des "fuites mémoire" vu que les réponses vont pas arriver forcément dans le bon ordre et voir pas du tout et peuvent finir par s'accumuler dans l'attente d'autant plus que les serveurs sont aussi programmé pour refuser les même demandes incessantes ou au mieux d'allonger les délais, alors la aussi l'interpréteur JavaScript va considérer que ton code lui prend un peu trop la tête et tout jeter.

    Et pour terminer la gestion des Promesses en jQuery est franchement sommaire et pas du tout adaptée à ce que tu en attend, il faut mieux en passer par la vraie gestions des promesses implémentée sur les interpréteurs tous les interpréteurs JavaScript qui pour une fois son non seulement identique et fiable sur tous les navigateurs mais plutôt bien pensée , à mon sens.

    Pour terminer je me demande bien qu'elle est la finalité de ton code, parce que, vu d'ici, ça à l'air d'une usine à gaz mal fichu.

    Est-ce que tu a vraiment besoin de lancer un processus répétitif? parce que c'est pas le genre de truc conseillé sur un interface HTML pour le web, sauf si tu le fait sur un serveur privé ??

  6. #6
    Membre habitué
    Homme Profil pro
    DCS
    Inscrit en
    Août 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : DCS
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2017
    Messages : 12
    Par défaut
    En clair je dois pas utiliser Ajax pour ma requête.

    La solution que je met en place doit fonctionner en mode navigateur kiosk sans aucune intervention humaine car il s'agit d'un panneau d'appel dont les données, provenant d'un xml, doivent être mise à jour à intervalle régulier (dans une 2ème étape dynamique).

    Je pensais utiliser Ajax pour la requête afin d'obtenir un effet plus propre mais si j'ai bien compris quoique je fasse j'aurais des fuites mémoire.

Discussions similaires

  1. [AJAX] - Rafraichissement d'un DIV avec setTimeOut
    Par Seb06 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/03/2011, 00h07
  2. [AJAX] Appolo 13 - Fuite mémoire avec XHR
    Par mecatroid dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/09/2007, 14h52
  3. [AJAX] Que faire contre les fuites mémoires (memory leaks)
    Par cassy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/08/2007, 16h50
  4. Fuites mémoires avec Vector
    Par ..alex.. dans le forum SL & STL
    Réponses: 15
    Dernier message: 10/08/2006, 11h35
  5. Fuite mémoire avec valgrind
    Par franchouze dans le forum C++
    Réponses: 3
    Dernier message: 05/06/2006, 16h47

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