Vous êtes sur la page 1sur 3

Disciplina:

Padres de Projeto
Aluno: Eduardo Pereira de Sousa


Padro Promise it will work.

Contexto


Na linguagem JavaScript bastante difundido o uso de funes assncronas e
no bloqueantes. Esse tipo de funo tem por caracterstica no retornar o resultado
solicitado imediatamente aps sua execuo ao passo que sua execuo no bloqueia
a execuo do cdigo que a chamou, permitindo que outras aes sejam executadas
antes mesmo do resultado ter sido retornado.




No exemplo 1 temos um erro bastante comum em um primeiro contato com a
linguagem JavaScript, espera-se que a funo facaAlgoAssincrono() retorne
imediatamente seu resultado, porm isso no ocorrer, e assim a chamada para
console.log() exibir um resultado diferente do esperado.




O exemplo 2 mostra a forma comum de se lidar com esse tipo de funo, por
meio da passagem de uma funo callback. A funo callback ser executada assim
que a funo facaAlgoAssincrono() obtiver seu resultado, e receber como parmetro
o resultado esperado. Neste exemplo tambm possvel observar a caracterstica no
bloqueante da funo, pois a chamada da linha 5 ser executada antes da chamada da
linha 2, ou seja, o cdigo principal no bloqueado pela funo facaAlgoAssincrono().

Problema


Essa forma comum de tratamento para funes assncronas leva a um
problema conhecido como callback hell, que se apresenta quando necessria a
chamada de outros mtodos assncronos dentro de uma funo callback. O callback
hell torna o cdigo JavaScript extremamente complexo, dificultando sua leitura,
aumentando a repetio de cdigo e o deixando suscetvel a erros.




O exemplo 3 mostra como algo simples, como uma funo para inserir um novo
usurio no banco de dados ou atualizar o usurio existente pode se tornar
extremamente complicada com o uso indiscriminado de callbacks, isso sem ao menos
haver um tratamento mais elaborado de erros, apenas a propagao do erro para o
chamador da funo.

Soluo


Promises so um padro de facto estabelecido e utilizado muito antes de sua
incorporao oficial a linguagem JavaScript, o que s veio a ocorrer com o padro
ECMAScript 6. Seu objetivo melhorar a organizao e reduzir a complexidade do
cdigo assncrono, tornando-o mais legvel e simplificando o tratamento de erros.

Uma Promise um objeto composto de 3 estados (pending, resolved e rejected)
que deve ser retornado por uma funo assncrona. Ao ser criada uma Promise estar
obrigatoriamente no estado pending, cabendo funo assncrona que a criou alterar
seu estado para resolved ou rejected quando o resultado da funo assncrona tiver
sido obtido, ou um erro ocorrer. Outra caracterstica fundamental de uma Promise
que aps o seu estado ser alterado para resolved ou rejected este se torna imutvel.

O resultado da funo assncrona ento conectado ao cdigo principal por
meio dos mtodos then(success) e catch(error) do objeto Promise. Estes mtodos
registram funes que devem ser chamadas quando a Promise tiver seu estado
alterado para resolved ou rejected. Uma funo registrada por meio desses mtodos
ser executada imediatamente caso o estado da Promise tenha sido alterado
anteriormente ao registro da funo.

A grande fora deste padro advm da possibilidade de concatenarmos
diversas chamadas ao mtodo .then(success), isso permite que o resultado de uma

funo registrada no parmetro success seja passado diretamente a funo registrada


no mtodo then(success) seguinte. Da mesma forma, caso a promessa seja rejeitada,
ou caso uma exceo seja lanada em uma das funes registradas no mtodo then() e
a prxima funo registrada em um mtodo catch executada. Com o uso de
promessas, o cdigo visto no exemplo 3 poderia ser reescrito como:




O exemplo 4 faz uso de um objeto Promise padro do JavaScript, e pressupe
que os mtodos do objeto Usuario tambm retornam Promises. Como pode-se notar
h uma significativa diminuio na complexidade do cdigo, e o tratamento de erros
de todas as funes assncronas concentrado em um nico ponto (mtodo catch), o
cdigo apesar de assncrono pode ser lido de forma linear, facilitando sua
compreenso.

Porque usar, ou deixar de usar Promises


O uso de Promises traz vantagens significativas em termos de legibilidade de
cdigo, reduo da complexidade e facilidade no tratamento de erros, por outro lado
acrescenta uma nova camada para o tratamento do cdigo assncrono, diminuindo a
performance do cdigo em relao ao mtodo de callback tradicional. Assim deve-se
avaliar cenrio a cenrio se sua utilizao ser vantajosa ou no, alm disso a migrao
de um cdigo que faz uso de callbacks para um cdigo baseado em Promises tarefa
trivial na maior parte dos casos, assim um cdigo que inicialmente no faz uso de
promises pode passar a utiliza-las de forma relativamente simples.

Vous aimerez peut-être aussi