Teljesített promise-ok létrehozása JavaScriptben
Időnként szükség lehet egy már teljesített promise
létrehozására. Erre két módszer áll rendelkezésre:
a Promise.resolve metódus sikeresen teljesített
promise-ot hoz létre, a Promise.reject
elutasított promise-ot hoz létre. Paraméterként ezek
a metódusok azt kapják, ami a promise eredménye
vagy hibája lesz.
Mikor lehet szükségünk egy már teljesített promise-ra? Nézzünk egy példát. Tegyük fel, hogy van egy függvényünk, amely paraméterként egy számot vesz át, aszinkron módon csinál valamit vele, és visszaad egy promise-t az eredménnyel:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
A függvényt a következő módon fogjuk használni:
func(5).then(function(res) {
console.log(res); // kiírja 25-t
});
Tegyük fel, hogy most úgy döntöttünk, hogy az aszinkron műveletet csak akkor hajtjuk végre, ha a kapott szám nagyobb nullánál. Ellenkező esetben a függvény eredménye nulla legyen:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nulla eredmény
}
}
Azonban most az történik, hogy a függvény
vagy egy promise-t, vagy egy számot ad vissza.
Emiatt már nem alkalmazhatjuk a then
metódust a függvény eredményére, mert abban
az esetben, ha a függvény számot ad vissza,
hibát kapunk:
func(0).then(function(res) { // hiba, a then metódust alkalmazzuk nullára
});
A Promise.resolve segít megoldani a problémát:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // promise-t adunk vissza, nem számot
}
}
Tegyük fel, hogy most úgy döntöttünk, hogy
az átadott nullára nullát kell visszaadnunk,
a nullánál kisebb számok esetén pedig kivételt
dobnunk. Ebben a Promise.reject metódus
segít:
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'); // visszaadunk egy elutasított promise-t
}
}