NEWS

Gelöst: JS: Wie erst nach File-Erstellung weiter?

  • Developer

    Hi,

    ich lasse eine neue Datei erzeugen, falls diese noch nicht existiert. Danach führe ich weiteren Code aus, ohne zu warten, bis das File erstellt wurde. Wie kann man das denn hier einbauen, dass erst dann der nachfolgende Code ausführt wird, sobald die Datei im Filesystem erstellt wurde?

    Siehe folgendes Script (Auszug):

    function startTailingProcess() {
     
        // Path to iobroker log file
        let strFsFullPath = getCurrentFullFsLogPath();
     
        // Create a new log file. It will created if it is not yet existing.
        // This will avoid an error if right after midnight the log file is not yet there
    																											 
        const fs = require('fs');
        if (fs.existsSync(strFsFullPath)) {
            // File is existing
        } else {
            // File is not existing, so we create it.
            if (LOG_DEBUG) log (DEBUG_IGNORE_STR + 'Log file is not existing, so we need to create a blank file.');
            fs.writeFile(strFsFullPath, '', function(err) {
                if(err) return log(err);
            }); 
        }
     
        // Now start new tailing instance
        if(LOG_INFO) log('Start new Tail process. File path to current log: [' + strFsFullPath + ']');
        G_tail = new G_Tail(strFsFullPath, G_tailOptions);
     
    }
    

    Frage kam hier auf: https://forum.iobroker.net/post/304548

    Danke für eure Hilfe.

  • Developer Most Active

    ich erzeuge in dem Fall 2 Dateien... die eine die ich haben will und wen diese da ist eine .ack (acknowledge) Daeti hinterher
    erst wenn diese da ist wiss ich das die richtig eDatei angelegt worden ist.. wird oft im FTP Transfer benutzt

  • Forum Testing Most Active

    Wahrscheinlich wohl nicht, aber bietet sich da nicht async/await an, oder kann man das bei Files nicht nutzen?

  • Developer

    @Mic sagte in JS: Wie erst nach File-Erstellung fortsetzen?:

    Wie kann man das denn hier einbauen, dass erst dann der nachfolgende Code ausführt wird, sobald die Datei im Filesystem erstellt wurde?

    Ich sehe 3 Möglichkeiten:

    1. Verwende fs.writeFileSync statt fs.writeFile. Aber Vorsicht, writeFileSync blockiert während des Schreibvorgangs den EventLoop, was bei vielen Schreibvorgängen die System-Performance beeinträchtigt.

    2. Lagere den Code, der nur bei vollständiger Datei ausgeführt werden soll, in eine eigene Funktion aus. Rufe diese Funktion sowohl im if-Branch (Datei existiert) und im Callback von writeFile (wenn es keinen Fehler gab) auf .

    3. Nutze das fs-extra-Modul, welches alle fs-Methoden promisifiziert (muss in der Adapterkonfiguration eingetragen werden) zusammen mit async/await:

    async function startTailingProcesses() {
      //...
      const fs = require("fs-extra");
    
      // ...
    
      // Zeile 15-17 ersetzen durch:
      try {
        await fs.writeFile(strFsFullPath, '');
      } catch (err) {
        log(err);
        // hier sollte vermutlich NICHT weiter gemacht werden,
        // die Datei existiert wahrscheinlich nicht
      }
    
      // ...
    }
    
  • Developer

    @AlCalzone
    Super, vielen lieben Dank für die ausführliche Antwort 🙂
    Ich habe jetzt zunächst deine Option 2 umgesetzt.

    Dabei wurde mir bewusst, dass ich mich nie wirklich mit Callback, Promises und async und await beschäftigt hatte. Dabei ist dies wohl enorm wichtig. Ich habe daher gleich mal ein paar setTimeout() raus geworfen aus meinem Script, und stattdessen async/await eingebaut.

    Gerade setTimeout() war/ist echt eine schlechte Gewohnheit, die ich damals halt so aus Scriptvorlagen übernommen und so bislang durchgezogen hatte, also z.B. einfach mal 2 Sekunden mittels setTimeout() setzen, um zu "hoffen", dass dann die vorherige Funktion durchlaufen ist.

    Ich werde nun nach und nach all meine Scripts auf callback und async/await umstellen. Damit kann ich auch ein deutlich besseres Errorhandling einbauen.
    Danke noch mal für den Augenöffner 👍 🕶

  • Developer

    @Mic sagte in Gelöst: JS: Wie erst nach File-Erstellung weiter?:

    einfach mal 2 Sekunden mittels setTimeout() setzen, um zu "hoffen", dass dann die vorherige Funktion durchlaufen ist.

    😱

Suggested Topics

2.1k
Online

36.7k
Users

42.4k
Topics

587.3k
Posts