JavaScript: Promise

É uma classe que permite a construção de funções de processamento assíncrono representando um valor que poderá estar disponível no futuro.

É uma classe que permite a construção de funções de processamento assíncrono representando um valor que poderá estar disponível no futuro.

Entender como funcionam as promises é essencial uma vez que as novas APIs JavaScript estão utilizando esta especificação como padrão no retorno de dados.


Guia do artigo:

Sintaxe

new Promise((resolve: Function, reject: Function) => void)
Propriedades

A lista a seguir descreve as propriedades do objeto.

Métodos

A lista a seguir descreve os métodos do objeto.

Funções

A lista a seguir descreve os métodos estáticos do objeto.

Na prática

Exemplo 1

Neste exemplo vamos construir uma Promise a partir de um setTimeout e em seguida resolve-la com o then.

const timeout = (duration) => { return new Promise((resolve, reject) => { setTimeout(resolve, duration) }) } timeout(3000) .then(function() { // executa o bloco após 3 segundos console.log('passou 3 segundos') })

Na linha 2 retornamos uma instância de Promise que recebe os argumentos resolve e reject ambas funções que representam "resolvido" ou "rejeitado", respectivamente. Elas são utilizadas como retorno para o resultado ou um erro do tipo Error da Promise.

Na linha 7 executamos a função timeout que retorna a promise que construímos anteriormente. É importante lembrar que toda promise retorna dois métodos recursivamente, o then e catch: o primeiro é executado quando a promise tem sucesso e o segundo quando ocorre uma falha na execução.

Exemplo 2

No exemplo abaixo executamos uma promise que resultou em uma falha, ou seja, nossa execução foi direcionada ao bloco catch. Veremos no bloco abaixo como esse tratamento é feito:

function getTodosOsUsuarios () { return new Promise((resolve, reject) => { reject(new Error('Não foi possível recuperar a lista de usuários')) }) } getTodosOsUsuarios() .catch(err => console.log(err.message)) // Não foi possível recuperar a lista de usuários

Exemplo 3

É possível resolver uma promise dentro de outra, por exemplo, considere a função getTodosOsUsuarios() onde recuperamos o código de todos os usuários cadastrados no sistema e em seguida pegamos o primeiro resultado para recuperar seus detalhes a partir da função getUsuarioById().

function getTodosOsUsuarios () { return Promise((resolve, reject) => { resolve([ 1, 2, 3 ]) }) } function getUsuarioById (id) { return Promise((resolve, reject) => { resolve({ id, nome: 'João da Silva' }) }) } getTodosOsUsuarios() .then(ids => getUsuarioById(ids[0])) .then(usuario => console.log(usuario)) // { id: 1, nome: 'João da Silva' }

Exemplo 4

Em algumas situações como mock de dados, pode surgir a necessidade de criar uma promise de forma rápida. Para isso podemos construir uma que não retorne valor algum, como no exemplo abaixo:

Promise.resolve() .then(() => []) .then(console.log) // []

Exemplo 5

Assim como no exemplo anterior pode ser necessário retornar um erro, e para isso contamos com o Promise.reject(err: Error) que podemos ver abaixo:

Promise.reject(new Error('falha na execução')) .catch(err => console.log(err.message)) // falha na execução

Compatibilidade

Engine Versão Minima
Node.JS ( V8) 6.4.0
Safari ( WebKit) 11.1
Chrome ( V8) 68
Microsoft Edge ( ChakraCore) 17
Firefox ( Gecko) 61

Nota: O Opera utiliza atualmente grande parte do código do Chrome como base para o seu próprio desenvolvimento e por isso ele não é mencionado nesta listagem.

Confira também

Artigos relacionados