Het creëren van vervulde promises in JavaScript
Soms kan het nodig zijn om een reeds
voltooide promise te creëren. Hiervoor bestaan
twee methoden: de methode Promise.resolve
creëert een succesvol vervulde promise, Promise.reject
creëert een afgewezen promise. Als parameter ontvangen deze
methoden dat wat het resultaat
of de fout van de promise respectievelijk wordt.
Wanneer kunnen we een reeds vervulde promise nodig hebben? Laten we kijken naar een voorbeeld. Stel we hebben een functie die een getal als parameter accepteert, er asynchroon iets mee doet en een promise met het resultaat teruggeeft:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
We zullen onze functie als volgt gebruiken:
func(5).then(function(res) {
console.log(res); // geeft 25 weer
});
Stel nu dat we besloten hebben dat we onze asynchrone operatie alleen zullen uitvoeren als er een getal groter dan nul is doorgegeven. Anders moet het resultaat van de functie nul zijn:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nul resultaat
}
}
Nu krijgt het echter dat de functie ofwel
een promise, ofwel een getal teruggeeft. Hierdoor kunnen we
niet langer de methode then op het resultaat
van de functie toepassen, omdat in het geval dat de functie
een getal teruggeeft we een fout krijgen:
func(0).then(function(res) { // fout, we passen de then methode toe op nul
});
Promise.resolve kan ons helpen het probleem op te lossen:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // we geven een promise terug, niet een getal
}
}
Stel nu dat we besloten hebben dat voor een doorgegeven
nul we nul moeten teruggeven, en voor getallen
kleiner dan nul - een uitzondering. Promise.reject
kan ons hierbij helpen:
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'); // we geven een afgewezen promise terug
}
}