Uma promise é uma forma mais fácil de trabalhar com códigos assíncronos no javascript. Ela é um objeto que é instanciado através da classe Promise e recebe uma função como parâmetro. Essa função é executada quando a promise é criada, porém sem bloquear a execução do código:
const p = new Promise(() => {
console.log('A promise está sendo executada.')
setTimeout(() => {
console.log('Resolvendo a promise...')
}, 3 * 1000)
})
console.log(p)
Como visto no código acima, uma promise possui diferentes estados, que são: pendente (estado padrão), rejeitada e resolvida (ou cumprida). A promise ficará em estado pendente até que seja resolvida utilizando o primeiro parâmetro da função usada na sua construção. Esse primeiro parâmetro é uma função que “resolve” a promise e passa adiante o valor do resultado:
const p = new Promise((resolve, reject) => {
console.log('A promise está sendo executada.')
setTimeout(() => {
console.log('Resolvendo a promise...')
resolve('Resultado')
}, 3 * 1000)
})
console.log(p)
setTimeout(() => {
console.log(p)
}, 5 * 1000)
Também podemos rejeitar a promise caso queiramos indicar que algo deu errado:
Obs.: repare que nesse caso a rejeição da promise é como um erro no código, que se não for tratado adequadamente irá resultar no término da aplicação. Veremos como fazer isso na próxima aula.
const p = new Promise((resolve, reject) => {
console.log('A promise está sendo executada.')
setTimeout(() => {
if (1 + 1 === 2) {
reject("Algo deu errado!")
}
console.log('Resolvendo a promise...')
resolve('Resultado')
}, 3 * 1000)
})
console.log(p)
setTimeout(() => {
console.log(p)
}, 5 * 1000)
Por fim, a prática comum ao usar as promises é retorná-las no final de uma função, assim elas serão executadas quando a função for chamada:
function execute() {
return new Promise((resolve, reject) => {
console.log('A promise está sendo executada.')
setTimeout(() => {
console.log('Resolvendo a promise...')
resolve('Resultado')
}, 3 * 1000)
})
}
const p = execute()
console.log(p)
setTimeout(() => {
console.log(p)
}, 5 * 1000)