JS-0602 - JavaScript Completo ES6 - Promises

Resposta para o agora, para o futuro ou para o nunca!
As Promisessão funções construtoras de "promessas". Como toda promessa humana, ela é uma função que pode ser cumprida... ou melhor, resolvida, ou não! São utilizadas em operações assíncronas com callbacksadicionados a si que são executados de acordo com a sua resolução.
Uma Promise funciona como um proxy para um valor que pode ainda estar indefinido no momento de criação da promessa, permitindo a associação de métodos de tratamento para eventos assíncronos diante de sucesso ou falha do callback. Assim, quando associada a métodos assíncronos, ao invés destes aguardarem o momento de execução após a sua resolução, retornam a promessa, permitindo que se comportem como métodos síncronos.
A Promise estará sempre em um dos seguintes estados:
- pending (pendente): estado inicial, em que a promessa não foi realizada nem rejeitada;
- fulfilled (realizada): estado final, em que ocorreu o sucesso na operação; e
- rejected (rejeitado): estado final, em que ocorreu a falha na operação.
Desta forma, existem dois resultados possíveis de uma promessa: realizada com um valor de retorno ou rejeitada por um motivo (erro). Quando um desses estados ocorre, o método then do objeto Promise é chamado, e ele chama o método de tratamento associado ao estado (rejected ou resolved). Isto permite que não haja uma condição de competição entre uma operação assíncrona e seus manipuladores que estão associados.
As Promises seguem o formato abaixo:
- Utiliza-se o operador new (são funções construtoras);
- Dentro da Promisse é passada uma função de callback com dois parâmetros especiais, que são as funções que serão realizadas por ocorrência do sucesso ou falha da promessa. O segundo parâmetro (rejected) pode ser omitido. Qualquer nome pode ser utilizado; e
- Uma condição definirá qual o tratamento será realizada.
Quando a condição de resolução da promise não é atingida, será ativada a função rejected. Ex:
O poder das Promises
O que torna as Promisses especiais são os métodos de seu prototype, then e cath, que retornam as promises e permitem a realização de encadeamento, tendo como parâmetro o retorno do seu passo anterior, em uma operação chamada composição.
Método then:
Método chave das Promises. O callback deste método é ativado somente quando a promise é resolvida. O argumento do callback é o valor passado na função resolved.
A utilização de Arrow Function pode simplificar o código:
A utilização de Promises só tem sentido em códigos com eventos assíncronos. Este é o seu propósito: garantir tratamento para retornos de eventos assíncronos. No exemplo abaixo, o estado da Promise fica como "pending", até que transcorra os cinco segundos em relação ao seu contexto. Depois da sua resolução, o retorno ocorre como esperado.
O encadeamento de métodos then é possível graças aoretorno da Promise, que é outra Promisee, como dito anteriormente, o primeiro argumento de cada then, será o valor do retorno da promise anterior.
No exemplo abaixo, será aplicado alterações em um objeto vazio a cada resolução de uma promessa:
Método catch:
Este método adiciona um callback à promise que será ativado quando ocorrer uma falha (rejected).
Podemos passar a função que será ativada caso a promise seja rejeitada diretamente em um método then como um segundo argumento:
Outros métodos
Método finally:
O finally executa uma função anônima definida assim que a promessa for finalizada, independentemente do resultado (resolução ou falha):
Método all de Promise:
Este método retorna uma nova promise assim que todas as promises dentro dela forem resolvidas ou ao menos uma rejeitada. O retorno é um array com as respostas de cada promise:
Método race de Promise:
Retornará uma nova promise assim que a primeira promise for resolvida ou rejeitada. Essa nova promise terá a resposta da primeira.
Vantagens:
A utilização de Promises tem as seguintes vantagens:
- Garantias: callbacks nunca serão chamados antes da conclusão da execução de um evento. Callbacks encadeados poderão ser chamados de acordo com o resultado da promise anterior;
- Encadeamento: possibilidade de execução de mais de uma operação assíncrona consecutiva, através de cadeias de promises; e
- Propagação de erros: uma cadeia de promises encerra se ocorrer uma exceção, de uma forma controlada, sendo uma característica essencial para a funcionalidade de operações assíncronas.