Obtendo o Resultado de uma Operação com Promise - JavaScript
Anteriormente, exploramos como, a partir de uma função promise, podemos passar para fora o resultado de uma operação assíncrona:
const myPromise = new Promise(function(resolve) {
console.log("Executando a operação assíncrona");
resolve("Olá mundo!");
});
Agora, vamos obter esse valor. Para receber o resultado de uma operação de promise, usamos a função then()
Promise
then(onFulfilled, onRejected);
O primeiro parâmetro da função, onFulfilled
resolve()
O segundo parâmetro, onRejected
reject()
A função then()
Promise
Assim, podemos obtemos os dados:
const myPromise = new Promise(function(resolve) {
console.log("Executando a operação assíncrona");
resolve("Olá mundo!");
});
myPromise.then(function(value) {
console.log(`Dados recebidos da promise: ${value}`);
})
O parâmetro value
resolve("Olá mundo!")
Executando a operação assíncrona Dados recebidos da promise: Olá mundo!
Para exemplificar, vamos chamar várias promises para ver a assincronia em ação:
const myPromise3000 = new Promise(function(resolve) {
console.log("[myPromise3000] Executando a operação assíncrona");
setTimeout(()=>{resolve("[myPromise3000] Olá mundo!")}, 3000);
});
const myPromise1000 = new Promise(function(resolve) {
console.log("[myPromise1000] Executando a operação assíncrona");
setTimeout(()=>{resolve("[myPromise1000] Olá mundo!")}, 1000);
});
const myPromise2000 = new Promise(function(resolve) {
console.log("[myPromise2000] Executando a operação assíncrona");
setTimeout(()=>{resolve("[myPromise2000] Olá mundo!")}, 2000);
});
myPromise3000.then((value)=>console.log(value));
myPromise1000.then((value)=>console.log(value));
myPromise2000.then((value)=>console.log(value));
Aqui, definimos três promises idênticas. Cada uma não é executada imediatamente, utilizando a função setTimeout
[myPromise3000] Executando a operação assíncrona [myPromise1000] Executando a operação assíncrona [myPromise2000] Executando a operação assíncrona [myPromise1000] Olá mundo! [myPromise2000] Olá mundo! [myPromise3000] Olá mundo!
Observamos que o primeiro a iniciar foi o myPromise3000
Além disso, não é necessário passar um valor em resolve()
const x = 4;
const y = 8;
const myPromise = new Promise(function() {
console.log("Executando a operação assíncrona");
const z = x + y;
console.log(`Resultado da operação: ${z}`)
});
myPromise.then();
Neste caso, a função na promise calcula a soma dos números x
y
Método Promise.resolve
Às vezes, é necessário simplesmente retornar um valor de uma promise. Para isso, pode-se usar o método Promise.resolve()
Promise
const myPromise = Promise.resolve("Olá mundo!");
myPromise.then(value => console.log(value)); // Olá mundo!
Definindo uma Promise por Meio de uma Função
Frequentemente, uma promise é definida por uma função que retorna um objeto Promise
function sum(x, y) {
return new Promise(function(resolve) {
const result = x + y;
resolve(result);
})
}
sum(3, 5).then(function(value) { console.log("Resultado da operação:", value);});
sum(25, 4).then(function(value) { console.log("Soma dos números:", value);});
A função sum()
resolve()
then()
O resultado:
Resultado da operação: 8 Soma dos números: 29
Mas, e se o princípio de tratamento do valor obtido da função assíncrona for o mesmo?
sum(3, 5).then(function(value) { console.log("Resultado da operação:", value);});
sum(25, 4).then(function(value) { console.log("Resultado da operação:", value);});
Nesse caso, a lógica de tratamento será repetida. Como o método then()
function sum(x, y) {
return new Promise(function(resolve) {
const result = x + y;
resolve(result);
}).then(function(value) { console.log("Resultado da operação:", value);});
}
sum(3, 5);
sum(25, 4);
Configuração Flexível da Função
E se quisermos que o programador tenha a opção de definir seu próprio manipulador, ou, se ele preferir, aplicar um manipulador padrão? Neste caso, podemos definir a função do manipulador como um parâmetro da função e, se não for fornecido, definir um manipulador padrão:
function sum(x, y, func) {
// se não for definido um manipulador, então definimos um manipulador padrão
if(func === undefined) func = function(value) { console.log("Resultado da operação:", value);};
return new Promise(function(resolve) {
const result = x + y;
resolve(result);
}).then(func);
}
sum(3, 5);
sum(25, 4, function(value) { console.log("Soma:", value);});
Aqui, na primeira chamada da função sum(3, 5)
function(value) { console.log("Resultado da operação:", value); }
function(value) { console.log("Soma:", value); }