Ich habe eine Node.js App. Diese App hat eine Schaltfläche, die einen Prozess startet. Die Schritte in diesem Prozess geben Versprechen zurück. Ich versuche diese Versprechen zusammen zu ketten. Aus irgendeinem Grund erhalte ich eine UnhandledPromiseRejectionWarning
. In meinen Augen habe ich das jedoch richtig eingerichtet. Mein Code sieht wie folgt aus:Node.js: Unhandled Versprechen Ablehnung - UnhandledPromiseRejectionWarning
var myButton = document.getElementById('myButton');
if (myButton) {
console.log('here');
myButton.addEventListener('click', executeAction('0'));
}
function executeAction(input) {
let param1 = 'A';
let promise = new Promise(function(resolve, reject) {
try {
executeStep1()
.then(result => executeStep2(param1, result, input))
.then(result => function(result) {
console.log('All done');
resolve(result);
})
.catch(err => reject(err))
;
} catch (ex) {
reject(ex);
}
});
return promise;
}
function executeStep1() {
let promise = new Promise(function(resolve, reject) {
try {
setTimeout(function() {
resolve('[something]');
}, 3000);
} catch (ex) {
reject();
}
});
return promise;
}
function executeStep2(p1, p2, p3) {
let promise = new Promise(function(resolve, reject) {
try {
setTimeout(function() {
console.log('step 2 has executed');
resolve('awesome!')
}, 3000);
} catch (ex) {
reject(ex);
}
});
return promise;
}
ich bestätigt habe, dass die executeStep2
Funktion bis zur Fertigstellung läuft. Ich basiere dies in der Tatsache, dass ich "Schritt 2 hat ausgeführt" im Konsolenfenster sehen kann. Zu meiner Überraschung sehe ich jedoch nie "Alles fertig" im Konsolenfenster. Stattdessen sehe ich das oben erwähnte UnhandledPromiseRejectionWarning
. Ich verstehe zwei Dinge über dieses Ergebnis nicht:
- Warum sehe ich nicht "Alles fertig" in der Konsole? Sollte diese Funktion nicht ausgeführt werden, nachdem
executeStep2
aufgelöst wurde? - Woher kommt die Ablehnung? Ich sehe nichts, was das ablehnt.
Vielen Dank für Ihre Hilfe!
Remove 'Funktion (Ergebnis)' in der zweiten 'then'. Sie verwenden dort bereits die Pfeilfunktionssyntax, um die Funktion zu deklarieren. –
Vermeide die ['Promise'-Konstruktor-Antipattern] (https://stackoverflow.com/q/23803743/1048572?Was-ist-die-Promose-Konstruktion-antipattern-und-wie-zum- Vermeiden-) trotzdem! Btw, du brauchst nie 'try {...} catch (err) {reject (err)}' in einem 'neuen Promise'-Callback, der Konstruktor macht das automatisch. – Bergi
Was genau ist das "etwas" in deinem "executeStep2", ist das eigentlich ein Ausdruck, der eine Ausnahme auslösen könnte? – Bergi