NEWS
Gelöst: JS: Wie erst nach File-Erstellung weiter?
-
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.
-
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 -
Wahrscheinlich wohl nicht, aber bietet sich da nicht async/await an, oder kann man das bei Files nicht nutzen?
-
@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:
-
Verwende
fs.writeFileSync
stattfs.writeFile
. Aber Vorsicht,writeFileSync
blockiert während des Schreibvorgangs den EventLoop, was bei vielen Schreibvorgängen die System-Performance beeinträchtigt. -
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 .
-
Nutze das
fs-extra
-Modul, welches alle fs-Methoden promisifiziert (muss in der Adapterkonfiguration eingetragen werden) zusammen mitasync/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 } // ... }
-
-
@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 -
@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.