Opprettelse av oppfylte promises i JavaScript
Noen ganger kan det hende du trenger å opprette
et allerede oppfylt promise. For dette finnes
det to metoder: metoden Promise.resolve
oppretter et vellykket oppfylt promise, Promise.reject
oppretter et avvist promise. Disse metodene
mottar som parameter det som blir resultatet
eller feilen til promise henholdsvis.
Når kan vi trenge et allerede oppfylt promise? La oss se på et eksempel. La oss si at vi har en funksjon som tar imot et tall som parameter, gjør noe 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 bruke funksjonen vår på følgende måte:
func(5).then(function(res) {
console.log(res); // vil skrive ut 25
});
La oss nå si at vi bestemmer at vår asynkrone operasjon kun skal utføres hvis tallet som sendes er større enn null. I motsatt fall skal resultatet av funksjonen være null:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // null resultat
}
}
Men nå blir det slik at funksjonen returnerer
enten et promise eller et tall. På grunn av dette kan vi ikke
lenger bruke metoden then på resultatet
av funksjonen, fordi i tilfellet hvor funksjonen returnerer
et tall vil vi få en feil:
func(0).then(function(res) { // feil, vi bruker then-metoden på null
});
Promise.resolve kan hjelpe oss med å 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 tall
}
}
La oss nå si at vi bestemmer at for overført
null skal vi returnere null, og for tall
mindre enn null - en unntakstilstand. Promise.reject
kan hjelpe oss 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'); // returnerer et avvist promise
}
}