Erstellen von erfüllten Promises in JavaScript
Manchmal kann es notwendig sein, ein bereits
erfülltes Promise zu erstellen. Dafür gibt es
zwei Methoden: Die Methode Promise.resolve
erstellt ein erfolgreich erfülltes Promise, Promise.reject
erstellt ein abgelehntes Promise. Als Parameter erhalten diese
Methoden das, was zum Ergebnis
oder Fehler des Promises wird.
Wann kann ein bereits erfülltes Promise nützlich sein? Schauen wir uns ein Beispiel an. Angenommen, wir haben eine Funktion, die eine Zahl als Parameter entgegennimmt, diese asynchron verarbeitet und ein Promise mit dem Ergebnis zurückgibt:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Wir werden unsere Funktion wie folgt verwenden:
func(5).then(function(res) {
console.log(res); // gibt 25 aus
});
Nehmen wir nun an, wir haben entschieden, dass wir unseren asynchronen Vorgang nur ausführen wollen, wenn die übergebene Zahl größer als Null ist. Andernfalls soll das Ergebnis der Funktion Null sein:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // Null-Ergebnis
}
}
Jetzt gibt die Funktion jedoch entweder
ein Promise oder eine Zahl zurück. Dadurch können wir
nicht mehr die Methode then auf das Ergebnis
der Funktion anwenden, da wir im Fall der Rückgabe
einer Zahl einen Fehler erhalten:
func(0).then(function(res) { // Fehler, wir wenden die then-Methode auf Null an
});
Das Problem können wir mit Promise.resolve beheben:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // geben ein Promise zurück, keine Zahl
}
}
Nehmen wir nun an, wir haben entschieden, dass wir für eine übergebene
Null, Null zurückgeben sollen, und für Zahlen
kleiner Null - eine Ausnahme. Dabei hilft uns
die Methode Promise.reject:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else if (num === 0) {
return Promise.resolve(0);
} else {
return Promise.reject('incorrect number'); // geben ein abgelehntes Promise zurück
}
}