Asynchron
File API
Dateinformationen
const fs = require('fs')
fs.stat('test.txt', (err , stats) => {
    if (err) {
        throw err
    }
    stats.isFile()  // true
    stats.isDirectory() // false
    stats.isSymbolicLink()  // false
    stats.size      // 1024000 (bytes)
})
Lesen einer Datei
const fs = require('fs')
fs.readFile('test.txt', "utf8", (err , data) => {
    if (err) {
        throw err
    }
    console.log(data)
})
Beschreiben einer Datei
const fs = require('fs')
const content = "Node was here!"
fs.readFile('test.txt', content, (err , data) => {
    if (err) {
        throw err
    }
    console.log(data)
})
| Funktion | Bezeichnung | 
|---|---|
| fs.access | Zugriff auf Datei oder Ordner prüfen | 
| fs.mkdir | Verzeichnis anlegen | 
| fs.readdir | Verzeichnis lesen, liefert Array von Einträgen | 
| fs.rename | Verzeichnis umbenennen | 
| fs.rmdir | Verzeichnis löschen | 
| fs.chmod | Berechtigungen ändern | 
| fs.chown | Besitzer und gruppe ändern | 
| fs.copyFile | Datei kopieren | 
| fs.link | Erstellt einen neuen festen Link | 
| fs.symlink | Erstellt einen neuen symbolic link | 
| fs.watchFile | Datei auf Änderungen überwachen | 
## Calllbacks
Callbacks erlauben es Funktionen an einen EventHandler, oder anderen Funktionen mitzugeben.
document.getElementById("button").addEventListener("click", () => {
    // element of id "button" clicked
});
Set Timeout
- Der Callback wird zu einem späteren Zeitpunkt (in ms) ausgeführt
 - Eintrag in die Timer-Liste, auch wenn Zeit auf 0 gesetzt wird
 - Kann mit clearTimeout entfernt werden
 
const id = setTimeout(() => {
    // runs after 50 milliseconds
}, 50);
clearTimeout(id);
Intervall
const id = setTimeout(() => {
    // runs every 2000 milliseconds = 2 seconds
}, 2000);
clearInterval(id);
### Sofort als möglich
setImmediate(() => {
    // runs as best as possible
});
Event Emitter
Auf etwas hören
const EventEmitter = require('events')
const door = new EventEmitter()
door.on('open', () => {
    console.log("Door was opened")
});
door.on('open', (speed) => {
    console.log(`Door was opened, speed: ${speed || 'unknown'}`)
});
Event auslösen
door.emit('open')
door.emit('open', 'slow')
Promises
// Funktion, die einen Promise erstellt und zurückgibt
function doSomethingAsync() {
  return new Promise((resolve, reject) => {
    // Simuliert eine asynchrone Aufgabe (z. B. eine Netzwerkanfrage)
    setTimeout(() => {
      const success = true;
      if (success) {
        resolve("Erfolg!");
      } else {
        reject("Fehler!");
      }
    }, 2000); // Simuliert eine Verzögerung von 2 Sekunden
  });
}
// Verwendung des Promises
doSomethingAsync()
  .then((result) => {
    console.log("Erfolgreich: " + result);
  })
  .catch((error) => {
    console.error("Fehler: " + error);
  });
Zustände
| Zustand | Beschreibung | 
|---|---|
| Pending | Ausgangszustand | 
| Fullfilled | Erfolgreich abgeschlossen | 
| rejected | Ohne Erolg abgeschlossen | 
- Der Zustandswechsel kann nur einmalig passieren
 - Der Endzustand kann entweder fullfilled oder rejected sein
 
Promise.All
- Erhält einen Array von Promises
 - fullfilled sobald ALLE fullfilled sind
 - Ist ein Promise rejected, dann ist das gesamte Objekt rejected
 
Promise.Race
- Erhält einen Array von Promises
 - Erfüllt sobald eine davon fullfileed ist
 - Ist ein Promise rejected, dann ist das gesamte Objekt rejected
 
Async / Await
function resolveAfter2Seconds(x) {
    return new Promise(resolve => {
        setTimeout( () => {
            resolve(x)
        });
    });
}
async function add1(x) {
    var a = resolveAfter2Seconds(20)
    var b = resolveAfter2Seconds(30)
    return x + await a + await b
}
add(10).then(console.log)