Oprettelse af opfyldte promises i JavaScript
Sommetider kan du have brug for at oprette et allerede
opfyldt promise. Til dette findes der
to metoder: metoden Promise.resolve
opretter et succesfuldt opfyldt promise, Promise.reject
opretter et afvist promise. Disse metoder
modtager som parameter det, der bliver resultatet
eller fejlen på promise henholdsvis.
Hvornår kan vi have brug for et allerede opfyldt promise? Lad os se på et eksempel. Antag at vi har en funktion, der modtager et tal som parameter, gør noget asynkront med det og returnerer et promise med resultatet:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Vi vil bruge vores funktion på følgende måde:
func(5).then(function(res) {
console.log(res); // vil udskrive 25
});
Antag nu at vi besluttede, at vi kun vil udføre vores asynkrone operation, hvis der overføres et tal større end nul. I modsat fald skal funktionens resultat være nul:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nul resultat
}
}
Men nu resulterer det i, at funktionen returnerer
enten et promise eller et tal. På grund af dette kan vi ikke
længere anvende metoden then på resultatet
af funktionen, fordi i tilfælde af at funktionen returnerer
et tal, får vi en fejl:
func(0).then(function(res) { // fejl, anvender then-metoden på nul
});
Promise.resolve kan hjælpe os med at løse problemet:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // returnerer et promise, ikke et tal
}
}
Antag nu at vi besluttede, at for det overførte
nul skal vi returnere nul, og for tal
mindre end nul - en undtagelse. Metoden Promise.reject kan hjælpe os med dette:
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'); // returner et afvist promise
}
}