Criação de Promises Resolvidas em JavaScript
Às vezes, você pode precisar criar uma promise
já resolvida. Para isso, existem
dois métodos: o método Promise.resolve
cria uma promise resolvida com sucesso, Promise.reject
cria uma promise rejeitada. Como parâmetro, esses
métodos recebem o que se tornará o resultado
ou o erro da promise, respectivamente.
Quando podemos precisar de uma promise já resolvida? Vejamos um exemplo. Suponha que temos uma função que recebe um número como parâmetro, faz algo com ele de forma assíncrona e retorna uma promise com o resultado:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Usaremos nossa função da seguinte forma:
func(5).then(function(res) {
console.log(res); // exibirá 25
});
Suponha agora que decidimos que nossa operação assíncrona será realizada apenas se um número maior que zero for passado. Caso contrário, o resultado da função deve ser zero:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // resultado zero
}
}
No entanto, agora acontece que a função retorna
ou uma promise, ou um número. Por causa disso, não podemos
mais aplicar o método then ao resultado
da função, pois no caso de a função retornar
um número, obteremos um erro:
func(0).then(function(res) { // erro, aplicando o método then a zero
});
O método Promise.resolve nos ajudará a corrigir o problema:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // retornamos uma promise, e não um número
}
}
Suponha agora que decidimos que para o zero passado
devemos retornar zero, e para números
menores que zero - uma exceção. O método Promise.reject nos ajudará nisso:
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('número incorreto'); // retornaremos uma promise rejeitada
}
}