Création de promesses résolues en JavaScript
Parfois, vous pourriez avoir besoin de créer une promesse
déjà résolue. Pour cela, il existe
deux méthodes : la méthode Promise.resolve
crée une promesse résolue avec succès, Promise.reject
crée une promesse rejetée. Ces méthodes reçoivent en paramètre
ce qui deviendra le résultat ou l'erreur de la promise respectivement.
Quand pourrions-nous avoir besoin d'une promesse déjà résolue ? Regardons un exemple. Supposons que nous ayons une fonction qui prend un nombre en paramètre, fait quelque chose de manière asynchrone avec celui-ci et retourne une promesse avec le résultat :
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Nous utiliserons notre fonction de la manière suivante :
func(5).then(function(res) {
console.log(res); // affichera 25
});
Supposons maintenant que nous ayons décidé que notre opération asynchrone ne serait effectuée que si un nombre supérieur à zéro est passé. Sinon, le résultat de la fonction devrait être zéro :
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // résultat zéro
}
}
Cependant, il en résulte maintenant que la fonction retourne
soit une promesse, soit un nombre. À cause de cela, nous ne pouvons
plus appliquer la méthode then au résultat de la fonction,
car dans le cas où la fonction retourne un nombre, nous obtiendrons une erreur :
func(0).then(function(res) { // erreur, on applique la méthode then à zéro
});
La méthode Promise.resolve nous aidera à résoudre le problème :
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // on retourne une promesse, et non un nombre
}
}
Supposons maintenant que nous ayons décidé que pour un zéro passé,
nous devrions retourner zéro, et pour les nombres inférieurs à zéro -
une exception. La méthode Promise.reject nous y aidera :
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'); // retournons une promesse rejetée
}
}