Executando verificação de segurança...
5

Async e Promise, O que é e qual a diferenca No Javascript

Entendendo o comportamento do Javascript

No JS temos um comportamento não tão comum em outras linguagens: o de executar 'uma coisa por vez'. Daí entram os comportamentos assíncronos, em que esperamos algo ser executado para, após isso, executarmos outra parte do programa

Entendo a diferenca entre Sincrono e Assincrono

Antes de tocarmos no principal deste arquivo, precisamos revisitar o que é um processo síncrono.
Um processo síncrono pode ser exemplificado como uma ligação telefônica, em que falamos e, no mesmo instante, o outro na linha nos responde. É certo que você terá sua resposta assim que falar.
Exemplo de código síncrono, onde recebemos a resposta de imediato:

    function soma(num1, num2){    
        return num1 + num2;  
    } 
    console.log(soma(5 + 5))
    

Porém, um processo assíncrono pode ser exemplificado como algo que você não sabe quando vai ser finalizado. Antigamente, quando enviávamos cartas, não ficávamos esperando até a carta chegar, pois poderia demorar anos ou meses. Continuávamos vivendo nossa vida normalmente. Isso é um belo exemplo de um processo assíncrono.

Promise

A Promise, por outro lado, trabalha como um método de tratamento de requisições e respostas assíncronas.
A Promise nada mais é do que um objeto que facilita o tratamento de requisições assíncronas, permitindo continuar a execução, finalizar ou ignorar. Para isso, temos três métodos principais:

.then()
.catch()
.finally()

  • .then()
    com o metodo then podemos executar uma funcao quando a promise é resolvida, por exemplo:

          function getUser(userId){
             const userData = fetch(`https://minhapi.com/users/${userId}`)
            .then(response => {
            
            if(!response.ok){
                trhow new Error("Erro na requisicao") 
            }
             return response.json
            })
            .then((data => console.log(data.name))
          }
          getUser(1);
          
          
    

    No codigo acima temos a simples representacao do metodo .then(), onde verificamos as promisse como correta, e concatenamos mais um .then que em caso de sucesso do primeiro, é executado em seguida.

  • .catch()
    o querido "catch", quando o vemos em um codigo já sabemos para que vamos ultiliza-lo, o metodo de tratamento de erros, tambem podemos concatena-lo com .then() para um tratamento "refinado" de erros:

    function getUser(userId){
            const userData = fetch(`https://minhapi.com/users/${userId}`)
           .then(response => {
           
           if(!response.ok){
               trhow new Error("Erro na requisicao") 
           }
            return response.json
           })
           .then((data => console.log(data.name))
           
           .catch(error => console.error(error))
         }
         getUser(1);
    
  • .finally()
    Por acaso, por fim o .finally, o metodo que executa independente dos erros, é a "ultima esperanca" da execucao do Promise

    function getUser(userId){
    const userData = fetch(https://minhapi.com/users/${userId})
    .then(response => {

          if(!response.ok){
              trhow new Error("Erro na requisicao") 
          }
           return response.json
          })
          .then((data => console.log(data.name))
          
          .catch(error => console.error(error))
          .finally(() => console.log("Sempre executa")) 
        }
        getUser(1);
    

O .finally() sempre será executado em nosso código, em última instância, não havendo, por padrão, uma convenção de variável a ser executada.

Async/Await

Os métodos Async/Await são relativamente novos, implementados na versão ES2017, porém construídos em cima das Promises. Isso mesmo: esse método é apenas uma abstração para a Promise, o que faz o código parecer mais síncrono, utilizando menos linhas e menos declarações complexas para alcançar o objetivo final.

Async

Quando declaramos uma funcao como async, automaticamente ela sempre retorna um promise, com os metodos then() e catch()

async function soma(x, y){
    return x + y;
};

que no promise a moda antiga seria declarado como:

soma(2,3).then(resultado=> console.log(resultado)
});

Await

Quando traduzimos de forma literal o await encotraremos algo como "Esperar".
Seria comos e pedissemos um lanche no delivery e aguardassemos o pedido na porta, sem esperar o app notificar.
Podemos representar o await da seguinte forma:

    async function getUser(userId) {
     let response = await fetch(`https://api.com/api/user/${userId}`); 
     let userData = await response.json();
     return userData.name;
 }

No trecho acima, aguardamos a resposta vinda da API. Quando essa resposta chega, aguardamos a atribuição do response.json e, por fim, retornamos.

Por fim...

É importante destacar que os métodos Promise e Async se diferenciam apenas em sua escrita e no tratamento de erros. No Promise, fazemos muito manualmente, enquanto no Async tudo fica muito mais visivelmente síncrono, trazendo maior fluidez ao código.
Também há diferença no tratamento de erros: enquanto no Promise podemos usar .catch() e .finally(), no Async precisamos usar try/catch ou try/finally.

Espero que voces tenham gostado dessa breve introducao

Carregando publicação patrocinada...
2

No contexto de javascript não é exatamente quando vai ser finalizado, mas se vai ser finalizado ao mesmo tempo que você precisa fazer outras coisas, o exemplo de cartas não representa bem a questão, um exemplo melhor:

Imagine um consultório médico ou enfermagem

O profissional identifica o paciente e busca o prontuário (seja sistema, pedir pra alguém buscar, desafixar no leito... Não importa) (async)

Enquanto o prontuário não chega ele vai fazendo a tal anamnese que é perguntar pro paciente o que ele está sentindo (sync)

Terminou a anamnese? Verifica se o prontuário chegou (scheduler de microtask interno do javascript)

Agora ele colhe dados vitais do paciente, frequência respiratória, cardíaca, pressão... (sync)

Terminou? Verifica se o prontuário chegou (scheduler de microtask interno do javascript)

Se o prontuário tiver chegado ele registra os dados, lê o prontuário e faz a prescrição (sync)

Prontuário não chegou? Aguarda (await)

Prontuário ainda não existe? Cria o prontuário (catch)

E aguarda os farmacêuticos (await) liberarem a medicação e depois a equipe técnica preparar e aplicar a medicação (sync)

Então async/promisses em JS é mais sobre pegar algo necessário apenas no final que sobre quando esse algo será finalizado

1
1

Bem, tem alguns pontos que não estão claros para o leitor ou estão completamente errados, como este aqui:

entram os comportamentos assíncronos, em que esperamos algo ser executado para, após isso, executarmos outra parte do programa

Isso é, na verdade o comportamento síncrono. O programa lê de cima para baixo em sequência. O que estive na sequência espera a linha atual ser interpretada primeiro. E é justamente isso que processos assíncronos resolvem.

Promises e Async/await:

Você afirmou que async/await é uma abstração para promises, o que não é verdade. Uma abstração não é isso. Recomendo que pesquise mais a fundo. Quer um exemplo? fetch é uma abstração para Request e Response, que por sua vez é uma abstração de outros conceitos de mais baixo nível.

Async/await é uma forma alternativa a promises para manipular processos assíncronos. É muito mais fácil e funcional assim. O fato de funções assíncronas retornarem Promises<T> não significa que isso é uma abstração.

Promises são uma abstração para processos assíncronos no JavaScript, isto sim é uma abstração.

Await:

Seria comos e pedissemos um lanche no delivery e aguardassemos o pedido na porta, sem esperar o app notificar.

Não é bem assim. O await faz que o código na sequência dentro do bloco da função assíncrona espere até que esta operação assíncrona esteja completa, se completar.

Também há diferença no tratamento de erros: enquanto no Promise podemos usar .catch() e .finally(), no Async precisamos usar try/catch ou try/finally.

O try...catch...finally é uma estrutura para capturar exceções. O catch método em promises faz o mesmo que da estrutura try...catch. Mesmo que você não coloque isso, a exceção vai "borbulhar" até ser capturada por algum try...catch, senão o programa para com uma exceção não capturada. Então da para usar try...catch com Promises também, se for melhor ou mais legível.

Além disso é possível e até comum dependendo do banco de dados, usar try, catch e finally juntos em uma função assíncrona.


Bem, a melhor parte disto é que você está no caminho. Acredito que esteja tentando aplicar a técnica de Feynmnan, mas talvez esteja se perdendo nisso. Suas analogias estão diluindo o conteúdo e tangenciando o tema central do aprendizado. Com mais um pouco de revisão, e prática, sei que no futuro você irá capturar a essência da coisa.