Skapa uppfyllda promises i JavaScript
Ibland kan du behöva skapa ett redan
uppfyllt promise. För detta finns det
två metoder: metoden Promise.resolve
skapar ett framgångsrikt uppfyllt promise, Promise.reject
skapar ett avvisat promise. Som parameter tar dessa
metoder det som blir resultatet
eller felet för promiset respektive.
När kan vi behöva ett redan uppfyllt promise? Låt oss titta på ett exempel. Antag att vi har en funktion som tar ett nummer som parameter, gör något med det asynkront och returnerar ett promise med resultatet:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Vi kommer att använda vår funktion på följande sätt:
func(5).then(function(res) {
console.log(res); // skriver ut 25
});
Antag nu att vi bestämde oss för att vi endast ska utföra vår asynkrona operation om ett nummer större än noll skickas. Annars ska resultatet av funktionen vara noll:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nollresultat
}
}
Men nu blir det så att funktionen returnerar
antingen ett promise eller ett nummer. På grund av detta kan vi inte längre
tillämpa metoden then på resultatet
av funktionen, eftersom vi i fallet där funktionen returnerar
ett nummer kommer att få ett fel:
func(0).then(function(res) { // fel, vi tillämpar metoden then på noll
});
Promise.resolve kan hjälpa oss att åtgärda problemet:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // returnerar ett promise, inte ett nummer
}
}
Antag nu att vi bestämde oss för att för skickad
nolla ska vi returnera noll, och för nummer
mindre än noll - ett undantag. Metoden Promise.reject kan hjälpa oss med detta:
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'); // returnerar ett avvisat promise
}
}