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 :

Exécuter une tâche javascript en arrière plan


Sujet :

JavaScript

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Exécuter une tâche javascript en arrière plan
    Bonjour,

    Ceci est mon premier post !

    Je travaille sur un logiciel de gestion médical et je dois afficher un certain nombre de listes que je génère en PHP et que je traite en Javascript. En bref je passe mon tableau à ma fonction JS qui créé une div par liste. En arrivant sur la page, toutes les listes générées sont cachées grâce à la méthode hide() de JQuery et une seule est affichée grâce à la méthode show(). J'ai un menu qui lorsque je clique sur une catégorie, cache la liste actuellement affichée pour montrer celle qu'on a sélectionnée.

    Le problème est qu'au chargement de la page ce traitement est affreusement long (environ 7000 ms) et j'aimerai que l'utilisateur ait accès à la première liste pendant que toutes les autres soient créés.

    Je cherche à exécuter un traitement en Javascript en "arrière plan". J'ai effectué pas mal de recherches mais je n'ai pas arrivé à saisir comment utiliser JQuery dans ce cas précis.

    Quelqu'un pourrait m'éclairer ? Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 223
    Points : 15 516
    Points
    15 516
    Par défaut
    vous parlez de PHP et ensuite JavaScript. cela veut dire que PHP génère la page avec toutes les données et ensuite c'est JavaScript qui construit tout ?

    dans ce cas, votre code JavaScript devrait ressembler à cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // 1re étape : générer la 1re liste
     
    // 2e étape : afficher cette liste
     
    // 3e étape : faire une boucle qui va générer les autres listes
    pendant la 3 étape, le code JavaScript continue de s'exécuter en arrière-plan pendant que l'affichage de la 1re liste est déjà en place.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    En reprenant votre exemple et avec plus de détails, mon code ressemble à ça :

    1) Php récupère les informations et les stocke dans un tableau

    2) Php envois le tableau en format JSON au JS

    3) Javascript créé les divs à partir du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //début boucle
     
    document.write("<div id='nomDuTableau"+indice+"' style='display: none'>" +
    // Contenu du tableau
    "</div>");
     
    //fin boucle
    4) On affiche la div qu'on veut avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ("nomDuTableau1").show()
    Si j'affiche la première liste à la fin de la première boucle ça ne bloquera pas la page tant que la boucle n'est pas terminée ?
    J'ai oublié de préciser que je suis sous symfony 1.4

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    le temps de traitement est il lié à PHP ou à javascript ? Ou les 2 ?
    Face à ce genre de problème j'aurai tendance à utiliser AJAX dont le premier A signifie Asynchrone, et cet asynchronisme permet justement de charger en tache de fond les tableaux qui ne sont pas affichés sans bloquer le navigateur.
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Malheureusement les 2 mais je suis "obligé" de faire le traitement PHP en 1er car sans lui je n'afficherai pas la première liste.

    Du coup j'avais pensé à l'AJAX mais j'ai pense qu'il perd son utilité vu qu'il n'y a plus de demande à faire au serveur et que je veux seulement "optimiser" le Javascript, non ?

    Je ne suis pas très expérimenté en Javascript mais je connais les bases, il y a certains points qui sont assez flous pour moi notamment les tâches asynchrone en JS et les callback que je n'ai pas vraiment réussis à saisir malgré mes recherches, c'est pour ça que je suis un peu perdu

  6. #6
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    Il y a plein de solutions de toute façon : plutôt que de générer toutes les listes et les cacher à l'affichage avec du javascript, puisque ces listes doivent se distinguer par un critère choisi dans le menu pour les afficher, on peut par exemple les appeler sur le serveur avec JS/Jquery une fois le critère choisi et les afficher dans le <div> avec une fonction comme jQuery.load() ou jQuery.getJSON()
    Le PHP ne génère que la liste en fonction du critère choisi et qui est passé en paramètre, et coté Javascript l'affichage ne concerne que cette partie de la liste.

    Ce n'est qu'un exemple les solutions sont infinies
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci fredoche pour ta réponse,

    c'est l'idée que j'avais lors de la conception de cette partie mais mon chef de projet a préféré que je génère toutes les listes d'un coup au chargement de la page, personnellement j'aurais préféré faire comme tu me le proposes mais je n'ai pas trop le choix

    Par contre je le connaissais pas jQuery.load() ou jQuery.getJSON(), je vais m'y attarder un peu car je pense que ça me servira très certainement prochainement

  8. #8
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    Et c'est le chef de projet qui te demande d'améliorer ces 7 secondes de chargement ?

    Ca sert à quoi de tout générer selon lui ? quel est l'intérêt s'il existe ?

    Ne serais tu pas victime de son ignorance du problème ou pire de son incompétence ?
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oui, car il y a maximum 400 lignes à récupérer et pour lui ce n'est pas un problème

    Je pense que c'est plus un problème d’égaux mais bon, je dois m'adapter et faire avec, on peut pas tous avoir un chef de projet digne de ce nom

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Il a pas tout à fait tort, en théorie récupérer les données totales de la BDD et les transmettre au navigateur ne devrait pas faire de différence notable avec récupérer uniquement la liste voulue. Pas si on est pas dans un ordre de grandeur de 10 fois plus grand.

    Par contre, récupérer les données, toutes ou partielles, en JavaScript plutôt que directement comme étant la page HTML affichée, et ensuite sérialiser et insérer ces données récupérées en JavaScript et les insérer dans la page, ça ça prend du temps. Et ça en prendra plus si on le fait avec plus de données qu'il n'est nécessaire d'afficher.

    Je penses que tu gagnerais en performances si :
    - En recevant les données, tu les conservais dans une variable de sauvegardes,
    - Tu n'insères dans la page que la liste que tu souhaites afficher
    - Tu insères les autres quand l'utilisateur demande à l'afficher. Ou alors tu les sérialises en tâche de fond avec un web worker pour que ce soit fait, et tu les insères toutes dans la page au prochain clic qui demande à afficher d'autres données.

    Ça devrait être plus réactif et à peu près équivalent au fait de n'avoir récupéré que la liste à afficher. (Récupérer que la liste à afficher n'étant déjà, en soit, pas très performant dans la mesure ou la page aurait pu contenir les données dès le départ dans la page au lieu de devoir les récupérer en JavaScript.)

    Citation Envoyé par saitaman Voir le message
    Je pense que c'est plus un problème d’égaux
    C'est sûr, si la conversation se faisait d'égal à égal, ta propre solution devrait lui paraître tout aussi valide que la sienne .
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    Sur le principe 400 lignes c'est très peu

    Par contre 400 lignes pour 7 secondes c'est juste énorme en 2017. Il y a donc forcément un ou des problèmes quelque part, entre la source de données, le serveur, la façon dont sont codées les différentes parties, 400 lignes extraites ou au total ...

    thelvin, récupérer les données totales de la BDD ,c'est juste un non-sens de mon point de vue. Autant dire que la BDD ne sert à rien, alors que c'est tout l'intérêt d'un SGBD que de traiter des données afin d'en extraire les parties utiles.

    Avec 400 lignes OK, multiplie ça par 10, 100, 1000 ça ne tient plus la route.

    La pagination a des intérêts techniques et ergonomiques
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 939
    Points : 44 112
    Points
    44 112
    Par défaut
    Bonjour,
    ... un certain nombre de listes que je génère en PHP et que je traite en Javascript.
    peut être serait-il intéressant dans dire plus le traitement car effectivement 400 lignes ne méritent pas 7s !

Discussions similaires

  1. Exécuter une tâche en "arrière plan" dans un container web
    Par Tyler_Durden dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/08/2011, 16h06
  2. code en c# pour exécuter une commande dos en arrière plan
    Par GhostMoon dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/03/2010, 10h48
  3. Exécuter une page PHP en arrière-plan
    Par sunseb7 dans le forum Langage
    Réponses: 1
    Dernier message: 13/12/2009, 20h51
  4. Exécuter une commande UNIX en arrière-plan
    Par sunseb7 dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2009, 11h08
  5. Réponses: 1
    Dernier message: 07/02/2006, 01h11

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