Signatur
Beschreibung
Die Eigenschaft reason eines PromiseRejectionEvent liefert genau den Wert, der beim Zurückweisen eines Promise übergeben wurde. Das ist z. B. das Argument von Promise.reject(wert), der Wert beim Aufruf von reject(wert) im Promise-Konstruktor oder eine Ausnahme, die in einer async-Funktion bzw. einem .then()-Callback geworfen wurde.
Man braucht die Eigenschaft vor allem in globalen Handlern für die Events unhandledrejection und rejectionhandled. Dort können Sie nicht behandelte Promise-Fehler zentral protokollieren, an ein Fehler-Monitoring (z. B. Sentry oder einen eigenen Endpunkt) senden oder dem Nutzer eine Meldung anzeigen.
Weil JavaScript erlaubt, jeden Wert zurückzuweisen, ist reason vom Typ any. Es kann ein Error mit message und stack sein, aber auch ein String, eine Zahl, ein einfaches Objekt oder undefined. Robuster Code prüft deshalb vor der Auswertung, z. B. mit reason instanceof Error.
Rückgabewert
reject() bzw. Promise.reject() übergeben oder in einer asynchronen Kette geworfen wurde. Kann auch undefined sein.Beispiele
Nicht behandelte Zurückweisungen global protokollieren
window.addEventListener("unhandledrejection", (event) => {
const { reason } = event;
if (reason instanceof Error) {
console.error("Unbehandelter Fehler:", reason.message);
} else {
console.error("Unbehandelte Zurückweisung mit Wert:", reason);
}
});
// Löst das Event aus, da kein .catch() vorhanden ist
Promise.reject(new Error("Verbindung fehlgeschlagen"));
Fehler an ein Monitoring-Backend senden
const serialisiereGrund = (reason) =>
reason instanceof Error
? { name: reason.name, message: reason.message, stack: reason.stack }
: { wert: String(reason) };
window.onunhandledrejection = (event) => {
navigator.sendBeacon(
"/api/fehler",
JSON.stringify({ typ: "unhandledrejection", ...serialisiereGrund(event.reason) })
);
// Standard-Konsolenausgabe des Browsers unterdrücken
event.preventDefault();
};
const ladeDaten = async () => {
const res = await fetch("/gibt-es-nicht");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
};
ladeDaten(); // kein await, kein catch
Nicht-Error-Werte und rejectionhandled
window.addEventListener("unhandledrejection", (e) => {
console.log("unbehandelt:", typeof e.reason, e.reason);
});
window.addEventListener("rejectionhandled", (e) => {
console.log("nachträglich behandelt:", e.reason);
});
const p = Promise.reject({ code: 42 });
// Später doch noch behandeln -> löst rejectionhandled aus
setTimeout(() => p.catch(() => {}), 1000);
Eigenes Event konstruieren (z. B. für Tests)
const promise = Promise.reject("Timeout");
promise.catch(() => {}); // echte Zurückweisung abfangen
const event = new PromiseRejectionEvent("unhandledrejection", {
promise,
reason: "Timeout",
cancelable: true
});
console.log(event.reason);
// Wichtig · Fallstricke
- Beliebiger Typ:
reasonist nicht zwingend einError. Zugriffe wiereason.messageoderreason.stackkönnenundefinedliefern oder beireason === nullsogar einenTypeErrorauslösen. Prüfen Sie den Typ vorher. - Schreibgeschützt: Eine Zuweisung an
event.reasonhat keine Wirkung (im Strict Mode gibt es einenTypeError). Den Wert legen Sie nur beim Konstruktor überinit.reasonfest. - Serialisierung:
JSON.stringify(new Error(\"x\"))ergibt{}, weilmessageundstacknicht aufzählbar sind. Übernehmen Sie die Felder beim Versenden von Fehlerberichten ausdrücklich. - Sicherheit/Datenschutz:
reasonkann sensible Daten enthalten (URLs mit Token, Serverantworten). Filtern Sie diese, bevor Sie sie an externe Dienste senden. - Kompatibilität: In allen modernen Browsern und in Web Workern verfügbar; Firefox erst ab Version 69. Node.js kennt kein
PromiseRejectionEvent, sondernprocess.on(\"unhandledRejection\", (reason, promise) => …). Hier wird der Grund direkt als erstes Argument übergeben.