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 :

FileReader() attendre la fin de chargement d'un fichier text


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut FileReader() attendre la fin de chargement d'un fichier text
    Bonjour,

    Dans le code ci-dessous, il y a deux fonctions : main() et file_uploaded().

    Après que l'utilisateur ait choisi le ou les fichiers à charger, la fonction main() va lancer la fonction file_uploaded() pour que les données des fichiers text se retrouvent au bon format dans le tableau "tableau_data".
    Ensuite, elle lance d'autres fonctions qui vont travailler à partir des données qui sont dans tableau_data.

    Cependant, les données n'ont pas le temps d'être chargées dans tableau_data que les fonctions function a() et function b() sont déjà lancées. Donc forcément, il y a des erreurs qui apparaissent.

    Je cherche donc un moyen d'attendre la fin du chargement du fichier text avant que les autres fonctions soient lancées.

    Code HTML : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <html>
    <head>
    	<title>Lire fichier</title>	
    </head>
    <body>
        <form>
    		<input id="dataFile" type="file" accept=".txt" multiple/></input>
        </form>
    	<script>
     
                    //Déclaration  des variables
                    let tableau_data = [];
                    let datafile;
                    let n = 1;
                    
                    
                    let input = document.querySelector('input');
                    // let preview = document.querySelector('.preview');
                    input.addEventListener('change', main);
                    
                    
                    function file_uploaded(datafile){
                            //Cette fonction permetTant de charger un fichier
                            let reader = new FileReader();
                            
                            reader.onload = function(event) {
                                            let records = reader.result.split("\r\n");
                                            //mise en forme du tableau de données
                                            mise_en_forme_donnees(records,";");
                                            records.forEach(function(element) {
                                                    tableau_data.push(element.split("="));
                                            });                     
                            };                              
                            reader.readAsText(datafile);    
                    }
                    
     
                    function main() {
                            // fonction principale
                            
                            n = document.getElementById("dataFile").files.length; // récupère le nombre de document à charger
                            
                            
                            for (var i = 0; i < n; i ++){
                                    datafile = document.getElementById("dataFile").files[i];
                                    file_uploaded(datafile); // lance la fonction de chargement du fichier.
                                    
                                    function a(tableau_data);
                                    function b(tableau_data);
                            }
                    }
     
            </script>
    </body>
     
    </html>

    Je vous remercie par avance pour votre aide.

    Yu Cloud

  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
    Un ajax sur le fichier texte ?
    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 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
    normalement un événement 'loadend' est déclenché en fin de lecture, que ce soit ou non "bien passé" et que le gestionnaire en est finit sur la lecture d'un fichier

    pour la suite l'utilisation des promesses peut être utile.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Le fichier que je souhaite lire est sur le pc de l'utilisateur et je ne souhaite pas le charger sur le serveur pour le lire ensuite.
    Donc je pense que l'AJAX n'est pas adapté à la fonction que je souhaite réaliser.

    J'ai pensé à mettre .addEventListener("loadend", function a) par exemple, ce qui m'aurait permis d'attendre le chargement du fichier pour lancer la fonction mais ça aurait bien fonctionné si j'avais uniquement 1 fichier à charger. Cependant, je boucle sur plusieurs fichiers et la lecture du fichier suivant est lancée avant même que le précédent ne soit chargé !

    J'ai également essayé la propriété .onloadend de FileReader() mais elle renvoie toujours null quelque soit la position où je mets le console.log pour observer l'état d'avancement du chargement du fichier.

    Je ne vois pas comment récupérer l'état du chargement et faire en sorte que le programme attende la fin du chargement avant de lancer les autres fonctions.

  5. #5
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Si j'ai bien compris, par rapport au code existant, le plus simple serait d'ajouter, à la fin de la fonction reader.onload = function(event) {}, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(--n===0) {
    	a(tableau_data);
    	b(tableau_data);
    }

  6. #6
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Citation Envoyé par Loralina Voir le message
    Si j'ai bien compris
    Après relecture, je me demande si j'ai bien compris : les fonctions "a" et "b" doivent être lancées après chaque fin de chargement de fichier ou bien une seule fois quand tout est fini ?
    A la limite, peu importe, mes remarques donnent des pistes pour les deux cas de figure.

    A noter cette variante classique qui consiste à charger les fichiers un à un : on charge le premier fichier, puis une fois chargé, on charge le deuxième et ainsi de suite.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Par défaut
    Citation Envoyé par Loralina Voir le message
    Après relecture, je me demande si j'ai bien compris : les fonctions "a" et "b" doivent être lancées après chaque fin de chargement de fichier ou bien une seule fois quand tout est fini ?
    Les fonctions "a" et "b" sont lancées après chaque fin de chargement.

    Citation Envoyé par Loralina Voir le message
    Ce serait possible avec await, mais bon, je trouve que cette fonction "main" aurait un petit aspect fourre-tout.
    Citation Envoyé par Loralina Voir le message
    Il n'est pas plus mal de bien séparer les tâches, plutôt que d'avoir une seule fonction "main".
    Avec la fonction main, je cherche justement à bien séparer les tâches... Chaque fonction a un rôle et celui de file_uploaded() est de charger les fichiers pour pouvoir ensuite utiliser les fonctions de traitement.
    Il me semble que mettre les fonctions de traitement dans le reader.onload revient à transformer file_uploaded() en fonction principale...

    Dans tous les cas, il apparaît que je dois changer la structure d'exécution des fonctions soit en les intégrant dans reader.onload soit en utilisant les promesses.

  8. #8
    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
    Sinon, pourquoi parler d'Ajax? quel rapport ?

  9. #9
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    comme je l'ai écrit plus haut, utilise les promesses, et ici en l’occurrence il faut caser un Promise.all() englobant chacune des lectures
    Je ne pense pas que cela soit nécessaire ici. A priori le code de Loralina devrait fonctionner correctement.

  10. #10
    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
    oui effectivement l'idée de Loralina est la bonne, ce qui donne :

    Code javascript : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    const ihm_input    = document.querySelector('#dataFile')
    var   tableau_data = []
     
    ihm_input.onchange =_=>
      {
      let countFicLu = ihm_input.files.length
     
      for(let inFile of ihm_input.files)
        {
        let reader = new FileReader()
        reader.onload =_=>
          {
          let records = reader.result.split('\n')
          for(let line of records)
            {
            tableau_data.push(line.split('='))
            }
          if(!--countFicLu)
            {  
            fct_a()
            fct_b()
            }
          }
        reader.readAsText(inFile); 
        }
      }
    function fct_a()
      {
      console.log( tableau_data )
      }
    function fct_b()
      {
      console.log( 'fct b' )
      }

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

Discussions similaires

  1. [Process] comment attendre la fin du chargement?
    Par elflamby dans le forum VB.NET
    Réponses: 1
    Dernier message: 03/04/2007, 15h04
  2. [FLASH MX2004] [AS2] Attendre la fin de chargement d'un fichier avant de continuer.
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 01/03/2007, 15h13
  3. Attendre la fin du chargement d'un clip
    Par arnaud_verlaine dans le forum Flash
    Réponses: 5
    Dernier message: 13/09/2006, 11h39
  4. attendre la fin de chargement d'une page avant de continuer le script
    Par jibouze dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/06/2006, 09h50
  5. Attendre la fin du chargement de la page dans un WebBrowser
    Par core1 dans le forum Web & réseau
    Réponses: 5
    Dernier message: 15/06/2003, 04h12

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