Die Skepping van Vervulde Promises in JavaScript
Soms mag jy dalk nodig hê om 'n reeds
voltooide promise te skep. Daar bestaan
twee metodes hiervoor: die metode Promise.resolve
skep 'n suksesvol vervulde promise, Promise.reject
skep 'n verwerpde promise. As parameter ontvang hierdie
metodes dit wat die resultaat
of fout van die promise onderskeidelik sal word.
Wanneer kan ons 'n reeds vervulde promise nodig hê? Kom ons kyk na 'n voorbeeld. Gestel ons het 'n sekere funksie wat 'n getal as parameter aanvaar, dit asynchroon verwerk en 'n promise met die resultaat teruggee:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Ons sal ons funksie op die volgende wyse gebruik:
func(5).then(function(res) {
console.log(res); // sal 25 uitdruk
});
Gestel ons het nou besluit dat ons die asinchrone operasie slegs sal uitvoer as 'n getal groter as nul oorgedra word. Andersins moet die resultaat van die funksie nul wees:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // nul resultaat
}
}
Maar nou gebeur dit dat die funksie teruggee
of 'n promise, of 'n getal. Hierdeur kan ons
nie meer die metode then op die resultaat
van die funksie toepas nie, want in die geval waar die funksie
'n getal teruggee, sal ons 'n fout kry:
func(0).then(function(res) { // fout, pas die then-metode op nul toe
});
Promise.resolve sal ons help om die probleem op te los:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // gee 'n promise terug, nie 'n getal nie
}
}
Gestel ons het nou besluit dat vir 'n oorgedra
nul ons nul moet teruggee, maar vir getalle
kleiner as nul - 'n uitsondering. Hierin sal die
metode Promise.reject ons help:
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'); // gee 'n verwerpde promise terug
}
}