Creación de promesas resueltas en JavaScript
A veces puedes necesitar crear una promesa
que ya esté resuelta. Para esto existen
dos métodos: el método Promise.resolve
crea una promesa exitosamente resuelta, Promise.reject
crea una promesa rechazada. Como parámetro, estos
métodos reciben lo que se convertirá en el resultado
o el error de la promesa respectivamente.
¿Cuándo podemos necesitar una promesa ya resuelta? Veamos un ejemplo. Supongamos que tenemos una función que recibe un número como parámetro, hace algo con él de forma asíncrona y devuelve una promesa con el resultado:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Usaremos nuestra función de la siguiente manera:
func(5).then(function(res) {
console.log(res); // mostrará 25
});
Supongamos ahora que decidimos que nuestra operación asíncrona la realizaremos solo si se pasa un número mayor que cero. En caso contrario, el resultado de la función debe ser cero:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // resultado cero
}
}
Sin embargo, ahora resulta que la función devuelve
o una promesa, o un número. Debido a esto, ya no
podemos aplicar el método then al resultado
de la función, ya que en el caso de que la función devuelva
un número obtendremos un error:
func(0).then(function(res) { // error, aplicamos el método then a cero
});
El método Promise.resolve nos ayudará a solucionar el problema:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // devolvemos una promesa, no un número
}
}
Supongamos ahora que decidimos que para el cero
debemos devolver cero, y para los números
menores que cero - una excepción. El método
Promise.reject nos ayudará en esto:
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'); // devolvemos una promesa rechazada
}
}