Promises und async await
Eine gängige Methode, um asynchrones JavaScript zu schreiben, ist die Verwendung eines Musters namens Promises. Promises sind ein Feature von ES6-JavaScript.
function wait(timeMilliseconds = 1000) {
return new Promise((resolve) => {
window.setTimeout(() => resolve(), timeMilliseconds);
});
}
Du kannst auf die Fertigstellung einer Promise warten und weitere Operationen mit der Funktion then()
der Promise durchführen:
wait(2000).then(() => {
console.log('Time is up!');
});
Fehler in Promises werden über .catch()
behandelt. Unten siehst du einen häufigen Anwendungsfall für Promises, nämlich das Abrufen von Daten:
function fetchUsers() {
return new Promise((resolve, reject) => {
fetch('/api/users')
.then(response => response.json())
.then(data => resolve(data))
.catch(err => reject(err));
});
}
async/await
Viel mit Promises zu arbeiten, kann zu einer Pyramide des Verderbens (Pyramid of Doom) führen:
wait(2000).then(() => {
console.log('2 seconds');
wait(2000).then(() => {
console.log('4 seconds');
wait(2000).then(() => {
console.log('6 seconds');
wait(2000).then(() => {
console.log('8 seconds');
wait(2000).then(() => {
console.log('10 seconds');
});
});
});
});
});
Das kann schwierig zu warten werden. Deshalb gibt es einen alternativen Weg: async
-Funktionen und await
.
const tenSeconds = async () => {
for (let i = 1; i <= 10; i++) {
await wait(1000);
console.log(`${i} seconds.`);
}
};
Eine async
-Funktion ist eine Funktion, die ein Promise-Objekt zurückgibt.
Innerhalb von async
-Funktionen kannst du await
verwenden, um auf die Fertigstellung eines Promises zu warten. await
kann nur innerhalb von async
Funktionen verwendet werden.
Du kannst eine asynchrone Funktion auch direkt aufrufen, aber dann hast du keine Kontrolle mehr darüber, wann die Funktion abgeschlossen ist.
Fehlerbehandlung in asynchronen Funktionen
Für die Fehlerbehandlung wird try-catch
verwendet.
const main = async () => {
try {
const users = await fetchUsers();
} catch(err) {
console.error(err.message);
}
}
main();
Mehrere Promises parallel abwarten
Du kannst await
mit Promise.all
verwenden:
const [users, posts] = await Promise.all([fetchUsers, fetchPosts]);
Rückgabetypen
Eine asynchrone Funktion in JavaScript gibt immer ein Promise zurück, auch wenn sie keinen asynchronen Code enthält:
const asyncFunction = async (): Promise<void> => {};
const asyncFunctionReturningAnswer = async (): Promise<number> => 42;