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

NodeJS Discussion :

Evenements asynchrones qui ne se passent pas


Sujet :

NodeJS

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut Evenements asynchrones qui ne se passent pas
    Bonjour,
    Je veux transmettre un fichier après traitement.
    1. J'envoie donc sur la cible la command open (ligne 3) -> elle passe
    2. J'ouvre le fichier d'origine et je prends les lignes une par une (lignes 8 à 11),
    3. Je traite chacune d'elle (lignes 12 à 27)
    4. Je l'écris sur la cible (ligne 28)
    5. Je ferme le fichier cible (avec close ligne 31)-> ça marche aussi

    C'est sans doute un pb de synchronisation mais comme je suis débutant en typescript je ne le trouve pas.

    Qqn peut m'aider ?
    Merci d'avance
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    async UploadFile2(file: string, target: string): Promise<void> {
            //@note UploadFile2
            let result = await this.SendAndRecv("f = open('" + target + "', 'w')\r\n", false);
            let commentaire: boolean = false;
            let ligneVide: boolean = false;
            const clearComments=this.clearComments;
     
            var lineReader = require('readline').createInterface({
                input: require('fs').createReadStream(file)
            });
            lineReader.on('line', async function (line) {
                if (clearComments) {
                    line = line.trimEnd();// Suppression des espaces en fin  de ligne
                    line = line.replace(/#.*/g, ""); // Suppression des commentaires mono ligne #
                    line = line.replace(/"{3}(.+?)"{3}/g, ""); // Suppression des commentaires mono ligne """
                    if (line.match(/"{3}/) && !commentaire) {// Suppression des commentaires multi ligne
                        commentaire = true;
                        line = line.replace(/"{3}.*/, "");
                    }
                    if (line.match(/"{3}/) && commentaire) {// Suppression des commentaires multi ligne
                        commentaire = false;
                        line = line.replace(/.*"{3}/, "");
                    }
                    line.trimStart() == ""?ligneVide=true:ligneVide=false
                }
                if (!commentaire && !ligneVide) {
                    line=line+"\r\n";
                    result =await this.SendAndRecv("f.write(" + line +")\r\n", false);
                }
            });
            result = await this.SendAndRecv("f.close()\r\n", false);
        }

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    je ne vois sais pas franchement où est ta question !


    Qqn peut m'aider ?
    Je te propose ce code pour exemple :
    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
    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
    const readline = require('readline');
    const fs = require('fs');
     
    // juste un affichage du résultat
    function callback(data) {
      data.forEach((d, ind) => {
        console.log(`${ind} -> ${d}`);
      });
    }
     
    /**
     * Lecture, traitement et écriture de données
     * @param {string} inputFile - le fichier des données à lire
     * @param {string} outputFile - le fichier de suavegarde des données traitées
     * @param {requestCallback} callback - la fonction à éxécutée à l'issue
     */
    function traiteFichier(inputFile, outputFile, callback) {
      const lineReader = readline.createInterface({
        input: fs.createReadStream(inputFile)
      });
     
      const result = [];
      let num = 0;
     
      lineReader
        // lecture ligne par ligne
        .on("line", (txt) => {
          // on fait le traitement sur la ligne
          txt = txt.split(" ")
            .reverse()
            .join(" ");
          // on stoque le traitement
          result.push(`${num += 1} :${txt}`);
        })
        .on('close', () => {
          // on sauve les données
          fs.writeFile(outputFile, result.join("\n"), function(error) {
            if (error) throw error;
            // si ok on exécute la fonction callback si existe
            callback && callback(result);
          });
        });
    }
    et l'appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    traiteFichier("input-fichier.txt", "output-fichier.txt", callback);

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Merci pour l'exemple il semble marcher mais en fait au final je n'obtient pas ce que je veux et je ne comprends pas pourquoi. Je viens de me farcir un bouquin sur le typescript j'attaque le suivant sur node.js

    En attendant, il y a un moyen de faire une bête lecture synchrone ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    En attendant, il y a un moyen de faire une bête lecture synchrone ?
    il te faut passer dans ce cas par des méthodes synchrone comme readFileSync, writeFileSync.

    Le presque même exemple en synchrone :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    const fs = require('fs');
     
    /**
     * lecture fichier, traitement des données et enregistrement des données modifées
     * @param {string} inputFile - le fichier des données à lire
     * @param {string} outputFile - le fichier de sauvegarde des données traitées
     * @returns {Array}  result - Tableau contenant les données traitées 
     */
    function traiteFichier(inputFile, outputFile, callback) {
      const result = [];
      let num = 0;
     
      // lecture des données
      const data = fs.readFileSync(inputFile, {
        encoding: "utf8"
      });
     
      // traitement des données
      const temp = data.split("\n");
      temp.forEach((txt) => {
        txt = txt.toUpperCase();
     
        // on stoque le traitement
        result.push(`${num += 1} :${txt}`);
      })
     
      // sauve les données traitées
      fs.writeFileSync(outputFile, result.join("\n"));
     
      // return le resultat
      return result;
    }
     
    const result = traiteFichier("input-fichier.txt", "output-fichier.txt");
    // le résultat est disponible ici
    console.log("Result :", result);

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    MERCI.

    Comme ça, ça marche.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Comme ça, ça marche.
    dans l'autre exemple cela marche également

    Si tu te diriges vers Node il va falloir, tôt ou tard, que tu te fasses à la nature asynchrone et non-bloquante par défaut de Node.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 105
    Points : 58
    Points
    58
    Par défaut
    Si tu te diriges vers Node il va falloir, tôt ou tard, que tu te fasses à la nature asynchrone et non-bloquante par défaut de Node.
    Aucun doute la dessus.
    D'un certain coté, ma vie de programmeur était plus facile quand je codais en assembleur et que j'était auteur de 100% du code que j'utilisais

    Merci encore.

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

Discussions similaires

  1. [XL-2010] Evenement Textbox_Exit qui ne se déclenche pas
    Par bboy-eazy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/11/2016, 11h49
  2. variables de session qui ne passent pas
    Par cels dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 28/11/2006, 10h46
  3. [SWING] Evenement qui ne se déclenche pas
    Par LordBob dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 15/06/2006, 15h57
  4. [Mail] liens qui ne passent pas...
    Par tnntwister dans le forum Langage
    Réponses: 13
    Dernier message: 03/01/2006, 18h42
  5. Evenement OnClick qui ne fonctionne pas sous firefox
    Par frechy dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/12/2005, 16h06

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