Signatur
Beschreibung
Die schreibgeschützte Eigenschaft promise des Interfaces PromiseRejectionEvent verweist auf genau das Promise-Objekt, das abgelehnt wurde. Das Ereignis wird global auf window (oder im Worker auf self) ausgelöst, und zwar als unhandledrejection, wenn ein Promise ohne Ablehnungs-Handler abgelehnt wird. Hängt man später doch noch einen Handler an, folgt rejectionhandled.
Gebraucht wird die Eigenschaft vor allem für globales Fehler-Monitoring: Man kann das betroffene Promise nachträglich behandeln (zum Beispiel .catch() anhängen), es als Schlüssel in einer Map oder WeakMap speichern oder abgleichen, welche zuvor gemeldete Ablehnung später doch noch behandelt wurde. Den eigentlichen Ablehnungsgrund bekommt man über die Schwester-Eigenschaft reason, nicht über promise.
Da promise das Original-Objekt ist, lässt es sich per Identität (===) vergleichen. So kann man die Ereignisse unhandledrejection und rejectionhandled einander eindeutig zuordnen.
Rückgabewert
Promise, das abgelehnt wurde und das Ereignis ausgelöst hat. Der Wert ist schreibgeschützt.Beispiele
Unbehandelte Ablehnungen global protokollieren
window.addEventListener('unhandledrejection', (event) => {
console.log('Abgelehntes Promise:', event.promise);
console.log('Grund:', event.reason.message);
});
// Promise ohne catch-Handler
Promise.reject(new Error('Server nicht erreichbar'));
unhandledrejection und rejectionhandled einander zuordnen
const offen = new Map();
window.addEventListener('unhandledrejection', (event) => {
offen.set(event.promise, event.reason);
console.log('Offene Ablehnungen:', offen.size);
});
window.addEventListener('rejectionhandled', (event) => {
// Identitätsvergleich über das Promise-Objekt
if (offen.delete(event.promise)) {
console.log('Nachträglich behandelt, offen:', offen.size);
}
});
const p = Promise.reject(new Error('Timeout'));
// Handler erst später anhängen
setTimeout(() => p.catch(() => {}), 1000);
Promise nachträglich behandeln und Standardmeldung unterdrücken
window.onunhandledrejection = (event) => {
event.preventDefault(); // keine Konsolen-Fehlermeldung des Browsers
event.promise.catch((err) => {
console.warn('Abgefangen:', err.message);
});
};
fetch('https://ungueltige-domain.invalid/api');
Ereignis manuell erzeugen (z. B. für Tests)
const p = Promise.reject(new Error('Test'));
p.catch(() => {}); // echte Ablehnung stillschweigend behandeln
const event = new PromiseRejectionEvent('unhandledrejection', {
promise: p,
reason: new Error('Test')
});
console.log(event.promise === p);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung an
event.promisehat keine Wirkung. Im Strict Mode löst sie einenTypeErroraus. promiseenthält nicht den Fehlergrund. Den liefertevent.reason.- Wer Promises als Schlüssel in einer
Mapablegt, hält sie im Speicher fest. Bei vielen Ablehnungen besser eineWeakMapverwenden oder die Einträge aktiv aufräumen. - Ein
.catch()imunhandledrejection-Handler behandelt das Promise zwar, die Standardmeldung in der Konsole bleibt aber stehen. Die lässt sich nur mitevent.preventDefault()unterdrücken. - Im Konstruktor
new PromiseRejectionEvent()istpromiseim Init-Objekt Pflicht. Fehlt es, wird einTypeErrorgeworfen. - Kompatibilität: Wird von allen modernen Browsern unterstützt, auch in Web Workern (über
self). Firefox unterstützt die Ereignisse erst ab Version 69. Node.js kennt dieses Interface nicht und nutzt stattdessenprocess.on('unhandledRejection', (reason, promise) => …).