Promises Javascript

Promises estão por todos os lados na linguagem javascript.

Antes do ES6, quase todas as funções usavam callbacks. Foi aí que, oficialmente, a representação de conclusão de operações assíncronas foram incluídas na linguagem.

A História

Por volta da década de 1970, criou-se o conceito de futures, deferred ou delays, que se referem a construções utilizadas para sincronização de execução do programa em linguagens de programação concorrente, de acordo com este artigo.

Em 2007 as Promises apareceram em uma biblioteca de nome MochiKit. Algum tempo depois, outras bibliotecas resolveram adotar a mesma especificação, como a jQuery e a Dojo.

O grupo CommonJS escreveu a especificação chamada Promises/A+ que tinha como objetivo ditar todas as regras para definir o que era uma Promise e sua interoperabilidade com outros sistemas.

O NodeJS já implementava nativamente Promises na runtime, que foram removidas em favor de callbacks (que é a forma como conhecemos NodeJS no início), depois do lançamento do ES6 a plataforma implementou nativamente a funcionalidade de Promises que já estava implementada no V8 desde algum tempo antes. Isto porque o padrão ES6 já implementa o modelo A+, que descrevemos antes, de forma nativa, portanto a grande maioria dos browsers já permite o uso de Promises sem nenhum tipo de biblioteca externa.

Descrição

Então, Promise é um objeto usado para processamento assíncrono. Uma "promessa" representa um valor que pode estar disponível agora, no futuro ou nunca.
Ela representa um proxy para um valor que não é necessariamente conhecido quando criada.
Isso significa que em um caso eventual de sucesso ou falha, métodos assíncronos retornem valores como métodos síncronos: ao invés de mostrar um valor final, ele faz uma promessa ao valor em algum momento futuro.
Uma Promise pode estar em um dos estados abaixo:

pending(pendente): Não foi nem rejeitada e nem realizada.
fulfilled(realizada): Sucesso.
rejected(rejeitada): Falha.
Uma Promise pendente será rejeitada por um motivo(erro) ou realizada com um valor. Quando isso ocorre o then do Promise é chamado, e o método de tratamento do estado associado(rejected ou resolved). Sendo a promessa realizada ou rejeitada, seu método correspondente será chamado e deste modo não haverá competição entre uma operação assíncrona e seus manipuladores que estão sendo associados.
Como os métodos Promise.prototype.then e Promise.prototype.catch retornam promises, eles podem ser encadeados - uma operação chamada composição.

Exemplo


No caso da imagem, um número é passado para uma constante e essa constante é passada como parâmetro para o método resolve, dentro da função de criação da Promise.
Uma característica forte de uma promise é que ela pode ser encadeada. Só é possível fazer esse encadeamento, por que um método then sempre retorna uma nova Promise, que por sua vez possui um método then disponível por padrão. Ou seja, um then pode ser encadeado no outro quantas vezes for necessário, como pode ser observado na imagem abaixo.


Outro método de encadeamento é o catch que também recebe uma função como argumento. É usando essa função dentro do catch que você vai cuidar do que deve acontecer quando a resposta obtida de uma operação não for uma resposta de sucesso. O catch só vai ser executado em duas situações. Primeira quando o método reject, dentro da função da criação da Promise é invocado. Segunda, quando o código dentro de algum then lança algum erro, conforme se segue.


Esse foi um exemplo simples de como construir uma promise.
Se você estiver interessado em se aprofundar no assunto, pode começar lendo esses livros abaixo:
Eu também não poderia deixar jamais de mencionar esse livro aqui, que para mim é um dos melhores já escritos no quesito procrastinação. Se você é um procrastinador, deve ler esse livro:

Comentários

Postagens mais visitadas