Suoritettujen promisejen luominen JavaScriptissä
Joskus saatat tarvita jo suoritetun
promisen. Tätä varten on olemassa
kaksi menetelmää: menetelmä Promise.resolve
luo onnistuneesti suoritetun promisen, Promise.reject
luo hylätyn promisen. Näiden menetelmien
parametrina on se, mikä tulee promisen
tulokseksi tai virheeksi vastaavasti.
Mille tilanteelle voimme tarvita jo suoritetun promisen? Katsotaanpa esimerkkiä. Oletetaan, että meillä on jokin funktio, joka parametrina ottaa numeron, tekee sillä jotain asynkronisesti ja palauttaa promisen tuloksella:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Aiomme käyttää funktiotamme seuraavalla tavalla:
func(5).then(function(res) {
console.log(res); // tulostaa 25
});
Oletetaan nyt, että päätimme suorittaa asynkronisen toimintomme vain, jos annettu numero on suurempi kuin nolla. Muussa tapauksessa funktion tulisi palauttaa nolla:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nollatulos
}
}
Kuitenkin nyt käy niin, että funktio palauttaa
joko promisen tai numeron. Tämän vuoksi emme
enää voi soveltaa metodia then funktion
tulokseen, koska funktion palauttaessa
numeron saamme virheen:
func(0).then(function(res) { // virhe, sovellamme then-metodia nollaan
});
Ongelman korjaamiseen auttaa Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // palautamme promisen, emme numeroa
}
}
Oletetaan nyt, että päätimme, että annetun
nollan tulisi palauttaa nolla, ja numeroille
pienempi kuin nolla - poikkeus. Tässä auttaa
meitä menetelmä 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'); // palautamme hylätyn promisen
}
}