Como dominar o JavaScript assíncrono: chamadas de volta, promessas e assíncrono/aguardado | Faisal Memon | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Como dominar o JavaScript assíncrono: chamadas de volta, promessas e assíncrono/aguardado

teacher avatar Faisal Memon, Product | Engineer | Entrepreneur

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução ao curso

      2:28

    • 2.

      Começando uma jornada maravilhosa com uma configuração inicial

      5:37

    • 3.

      Dominando as chamadas de volta: os fundamentos do JavaScript assíncrono

      25:13

    • 4.

      Promessas desbloqueadas: escrevendo um código assíncrono mais limpo e gerenciável

      18:49

    • 5.

      async/await: a maneira moderna de lidar com JavaScript assíncrono

      6:48

    • 6.

      Conclusão do curso

      1:53

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

35

Estudantes

--

Sobre este curso

Boas-vindas ao curso "Dominando o JavaScript assíncrono: chamadas, promessas e assíncrono/espera"! Este curso foi projetado para ajudar você a entender e dominar os conceitos centrais da programação assíncrona em JavaScript. Quer você esteja criando aplicativos web, lidando com chamadas API ou trabalhando com dados de maneira não bloqueadora, este curso fornecerá a você as habilidades de que precisa.

Vamos começar apresentando as chamadas de volta, a maneira tradicional de lidar com operações assíncronas. Você vai ganhar uma compreensão sólida de como eles funcionam e quando usá-los de forma eficaz.

Em seguida, vamos nos aprofundar no assunto Promessas, que são uma maneira mais moderna e poderosa de gerenciar operações assíncronas. Você vai aprender a trabalhar com cadeias de promessa, lidar com erros e simplificar seu código.

Por fim, vamos explorar o async/await, que permite que você escreva código assíncrono em um estilo síncrono. Este será o destaque da sua jornada de aprendizagem, pois torna o código assíncrono mais fácil de ler, manter e depurar.

Ao final deste curso, você estará equipado com uma base sólida na programação assíncrona, permitindo que você lide com tarefas complexas e reais no JavaScript sem problemas. Quer você seja iniciante ou queira aprimorar suas habilidades, este curso é para você!

Conheça seu professor

Teacher Profile Image

Faisal Memon

Product | Engineer | Entrepreneur

Professor

Hey - this is Faisal and thanks for being here.

I have over 12 years of experience working as a Product Manager Founder/CEO Engineer in Mobile and App development industry. I have been building global products being used by millions of users across the globe since the beginning of my career.

Currently I am heading Product at one of the fast-paced startup in India and enjoying every moment of it. Prior to his, I built out couple of startups which had over half a million users across the globe, raised funding from Google other investors and was part of Google Launchpad Accelerator. I have experience of building products from scratch and scaling to global users.

I am here on Skillshare to share my knowledge with seekers and help them grow personally and professional... Visualizar o perfil completo

Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução ao curso: Bem-vindo ao Mastering Asynchronous JavaScript com a ajuda de callbacks, promessas e palavras-chave de promessas Meu nome é Wessel e serei seu instrutor durante todo o curso Estou empolgado em guiá-lo por um dos conceitos mais importantes no mundo do desenvolvimento de JavaScript, que é lidar com operações assíncronas Um pouco complicado no início, mas é uma etapa essencial na criação de aplicativos web eficientes e sem bloqueio Neste curso em particular, divido tópicos complexos em pequenos e fáceis de entender aplicativos pequenos e fáceis de entender . Se você estiver lidando com APIs, esse conhecimento permitirá que você trabalhe com várias tarefas ao mesmo tempo sem diminuir a velocidade do aplicativo Então, aqui está uma prévia do que abordaremos neste curso específico Então, começaremos com retornos de chamada e entenderemos como você pode usar retornos de chamada em seu aplicativo baseado em script de trabalho Em seguida, passaremos às promessas, que é uma alternativa moderna e poderosa aos retornos de chamada Aprenderemos esses conceitos ou todos esses conceitos ao longo do curso com a ajuda de exemplos reais e de forma prática. Por fim, exploraremos as palavras-chave async e await, e você escreverá um código assíncrono que se parece e se comporta exatamente como o código síncrono que se parece E é simples e muito, muito poderoso. Vamos desvendar essas possibilidades e esses conceitos ao longo deste curso específico e, ao final deste curso, você terá uma sólida compreensão da escrita de código assíncrono no mundo do script Ja Este curso é para desenvolvedores de todos os níveis. Se você é um desenvolvedor de script Ja de nível avançado que está apenas procurando abordar certos conceitos em um Ja Script síncrono, então você pode se inscrever neste curso ou se você é um iniciante que deseja explorar esse conceito de retornos de chamada, promessas e espera assíncrona, então você pode se apenas procurando abordar certos conceitos em um Ja Script síncrono, então você pode se inscrever neste curso ou se você é um iniciante que deseja explorar esse conceito de retornos de chamada, promessas e espera assíncrona, então você pode se inscrever e aproveitar um curso. E se você é um desenvolvedor de nível intermediário, este curso também certamente o ajudará. Portanto, este curso é para desenvolvedores de todos os níveis. Como eu disse, seja você um grande desenvolvedor de nível intermediário ou um profissional de nível avançado. Ok, você vai tirar algo desse curso. Agora, você está pronto para aprimorar suas habilidades em ja Script? Estou super animada. Vamos mergulhar juntos neste curso. 2. Começando uma jornada maravilhosa com uma configuração inicial: Olá, pessoal. Então, para executar o JavaScript, vamos fazer algumas configurações em nossa máquina local, certo? Agora, é claro, você pode executar o JavaScript clicando com o botão direito do mouse assim no navegador , indo até o console e escrevendo tratamentos de JavaScript aqui. Mas isso não é ideal se você quiser escrever scripts longos e grandes para aplicativos web de nível de produção. Agora, é aqui que você precisa de uma configuração em sua máquina local. Então, o que vamos fazer é usar um IDE. Se você não conhece esse termo IDE, ele significa ambiente de desenvolvimento integrado, que fornece o conjunto de ferramentas para escrever código e executá-lo. Então, vou pesquisar o código do Visual Studio porque é isso que vamos usar. Agora, se você já tem um código do Visual Studio instalado em seu sistema ou sabe como instalá-lo, tudo bem. Mas vou supor que você não o tenha instalado em seu sistema para beneficiar os alunos que não estão cientes desse processo. Então, vou acessar esse site específico, code.visualstudio.com Está bem? Um pouco de Zoom in. Agora, aqui, a captura de tela que você vê é aparência do código do Visual Studio, ok? E você pode ver, há um destaque de sintaxe que você pode Portanto, a interface está sendo destacada em uma cor diferente. Os adereços dos botões estão sendo destacados em uma cor diferente. Então, esses são todos os benefícios do IDE, ok? Você pode ver a bela estrutura de pastas no lado esquerdo. Há um terminal abaixo com todo o código de cores e tudo Ele oferece muitos benefícios para o desenvolvedor. Portanto, se você rolar para baixo, poderá ver os suportes de código do Visual Studio. Enquanto estou gravando este vídeo, ele suporta muitas linguagens de programação, ok? Você pode até mesmo adicionar extensões. Agora, o que são extensões? As extensões basicamente estendem ou ampliam a capacidade que o código do Visual Studio tem por padrão. Está bem? Então, se você quiser adicionar algum suporte para Python, ok Então, mais suporte para Python. Então você pode adicionar essa extensão. Se você quiser adicionar suporte ao GeuCpiloto e usar a IA durante a programação, você pode adicionar o Get up Copilot CC Você pode ver que existem inúmeras extensões e há um mercado de extensões de onde você pode baixar e instalar tudo isso, e é gratuito. Você pode ver o copiloto do Git up, um pouco de. Então, tudo está destacando recursos diferentes. Você pode personalizar os temas de cores, configurações e perfis. Há muitas coisas, ok? Tem uma integração muito boa com o sistema de controle de movimento e tudo Está bem? Assim, você pode dar uma olhada neste site e ver o que ele tem a oferecer. Mas se você rolar para cima, aqui você verá esse botão de download para Windows, ok? Agora, se você estiver no Mac ou Linux, verá a opção de download para o sistema operacional apropriado. Ou, se você não estiver vendo por algum motivo, você pode acessar outras plataformas e ver quais plataformas são suportadas aqui. Está bem? Então, eu já tenho o código do Visual Studio instalado no meu sistema, então não vou instalá-lo, mas a instalação é muito simples É como qualquer aplicativo que você instala no sistema. Não há nenhuma configuração complexa que você precise mesmo para Mac, é mais fácil, e você pode ver aqui que existem várias versões, como se você estivesse usando o chip Intel, você pode instalar este. Apple Silicon, você tem esse aqui. E também para sistemas baseados em Linux Ubuntu aqui, você tem a opção de baixar e instalar. Está bem? Agora eu definitivamente tenho isso instalado no meu sistema, ok? Então, aqui, eu o instalei, como você pode ver. Está bem? Então, se você instalá-lo e abri-lo pela primeira vez, é isso que você vai ver. É assim que isso vai mostrar você. Sua visão pode ser um pouco diferente porque eu já sou usuário do Visual Studio Code, então estou vendo os projetos recentes que usei. Então eu vou fechar isso, ok? E aqui está me perguntando que, Ei, você ainda não abriu nenhuma pasta. Sim, você pode abrir pastas aqui na barra lateral esquerda e ela mostrará a estrutura da árvore. Você pode criar arquivos e gerenciá-los aqui mesmo, ou pode até mesmo clonar um repositório E, como eu disse, ele tem uma integração muito boa com os sistemas de controle Git of Ocean Então você também pode fazer uso disso. Tudo bem? Agora, o que eu pediria que todos vocês fizessem é acessar sua estrutura de pastas e criar uma pasta, quando forem praticar o Jscript Está bem? Então esta é a minha pasta onde vou praticar o Ja Script, ok? E basta abrir essa pasta aqui no código do Visual Studio. Abra a pasta, você pode dizer abrir pasta e navegar até a pasta que acabou de criar. Ou, alternativamente, você está no Windows, você tem uma opção. Você pode clicar com o botão direito do mouse. Você pode dizer mostrar mais opções e pode dizer abrir com o código do Visual Studio aqui. Abra com o código aqui. Isso é o que é. Então, isso é o Visual Studio, que não é o código do Visual Studio, é diferente. Então você tem que dar uma olhada nesse logotipo. Está bem? Essa. Está bem? E se você disser abrir, você verá a pasta aberta aqui. Ok. Maximize isso. Está bem? Você pode ver. Agora eu tenho duas instâncias ou duas janelas ou código do Visual Studio aqui. Está bem? Esta é minha pasta que eu criei chamada JavaScript. E é aqui que vou criar todos os meus arquivos relacionados ao Ja script e tudo que vou aprender. Então é só isso. Espero que você também tenha conseguido fazer essa configuração com sucesso em seu sistema. 3. Dominando as chamadas de volta: os fundamentos do JavaScript assíncrono: Então, agora é a hora de falarmos sobre retornos de chamada. Agora, o que é um retorno de chamada? Então, por definição, um retorno de chamada é uma função que é passada como argumento para outra função Está bem? Uma função que é passada como argumento para outra função e executada após conclusão de um determinado evento ou operação. Agora, vamos entender em detalhes por que você precisa de algo chamado callbacks Está bem? Então, deixe-me dar um exemplo. Agora, haverá cenários em que você está trabalhando em algum tipo de código em que precisará realizar algum tipo de evento externo ou interface com algum sistema externo, ok que pode levar um pouco de tempo , pode não ser instantâneo como as operações básicas, mas pode envolver algum tempo que seu sistema precise esperar para obter a saída, ok? Por exemplo, uma chamada de API. Então, se você estiver fazendo uma chamada de API, o que aconteceria se você normalmente esperasse pela resposta da chamada de API, certo? Não é como se você acionasse a chamada da API e recebesse uma resposta instantânea. Não é assim. Você acionou uma chamada de API, espera pela resposta, recebe a resposta e depois usa a resposta. Está bem? Então, vamos simular um cenário em que fazemos uma chamada de API Ok. Então, o que eu faria é simular um cenário com a ajuda da função de tempo limite. Está bem? Então, em JavaScript, temos algo chamado tempo limite, ok, que basicamente usado pode ser usado para definir um atraso no seu lado Está bem? Então, deixe-me dar um exemplo aqui. Está bem? Então, digamos que eu tenha essa mensagem. Ok, então eu posso dizer Console dot log aqui. Ok. E posso dizer imediato. Agora, essa mensagem será exibida imediatamente, certo? Não é como se fosse exibido depois de um tempo aqui, certo? Ele seria exibido imediatamente. Está bem? Mas haverá cenários em que talvez eu queira causar um atraso Então, nesse caso, você pode usar o tempo limite. Então você pode dizer que defina um horário aqui. Ok. Eu posso ter uma função como essa, o. E isso seria uma função anônima, sem parâmetros. Eu posso dizer Csol log, eu posso dizer atraso. Algo parecido com isso. E eu posso até definir o tempo de atraso. Então, digamos 2000. Agora, 2000 são milissegundos, o que significa que serão atrasados em 2 segundos. Então eu posso salvar isso. Você pode ver imediatamente e depois de 2 segundos, você verá um atraso aqui, certo? Então é assim que funciona. Se eu adicionar três pontos aqui, se eu salvar isso, você verá imediato e depois um atraso Está bem? Então, por que estamos aprendendo sobre o tempo limite agora? Por que estamos discutindo o tempo limite? Porque vamos usar o tempo limite para simular um exemplo de algo que depende de um sistema externo, como uma chamada de API, A chamada de API levará um pouco de tempo, certo? Por exemplo, você acionará sua solicitação para o servidor e, em seguida, o servidor processará a solicitação. Vou falar com o banco de dados e ele entrará em contato com você com os dados. Está bem? Portanto, há um pequeno atraso, como 1 segundo, 2 segundos, dependendo da velocidade das coisas , certo? Então, haverá um atraso, e como podemos simular um atraso Simularemos o atraso no código R com a ajuda do tempo limite Certo? Então, digamos que eu tenha um trecho de código aqui. Ok. O que eu vou fazer é criar uma função. Está bem? Então, há uma função. Vou chamar essa função de buscar dados aqui. Está bem? Eu não preciso de nenhum tipo de parâmetro aqui. Ok. E eu terei definido o tempo limite aqui assim. Ok. E eu posso realmente usar as funções de seta aqui. Está bem? Em vez da sintaxe antiga, posso atualizar para as funções de seta E aqui, posso dizer que os dados foram obtidos do servidor. Está bem? Então, eu posso obter dados de. Ok. E aqui, posso adicionar um atraso de 2 segundos. Está bem? Então, isso está feito. Tudo bem. E o que podemos fazer é chamar essa coisa em particular. Ok. Então, digamos que eu tenho, eu posso dizer função aqui. Eu posso dizer que os dados do processo estão aqui, ok? E aqui, posso dizer buscar dados, algo assim. Ok. Estou chamando isso. E eu estou chamando dados do processo. Está bem? Estou dizendo, ok, então estou dizendo dados do processo. Ok. Algo parecido com isso. O que está acontecendo é que eu estou chamando primeiro os dados do processo aqui, como você pode ver, dados do processo. Os dados do processo estão então chamando fetch data, e fetch data está fazendo algum tipo de operação, como falar com um EPI ou algo assim, e está obtendo Está bem? Se eu salvar isso, ok, você verá o atraso e os dados do servidor após 2 segundos. Está bem? Então, por enquanto, vou remover isso, vou apenas comentar isso , pois entendemos o que é o tempo limite Mas aqui, o que estamos tentando fazer é buscar os dados e os dados estão sendo buscados com um atraso de 2 segundos Está bem? Agora, digamos que estamos buscando os dados e obtemos algum tipo de resposta que queremos capturar Ok. Digamos que estamos buscando os dados e obtemos uma resposta do servidor que queremos capturar Então, terei um retorno hipotético aqui, que representará Digamos que esses sejam os dados que estão sendo representados pelo servidor. Está bem? Está dizendo dados de amostra. Está bem? O que aconteceria nesse caso é que eu poderia obter os dados aqui. Posso dizer que deixe os dados aqui. Ok. Eu posso fazer um log do console aqui. Ok, eu posso ver dados, algo assim. Se eu salvar isso, você verá que não recebo uma saída. Eu fico indefinido. Está bem? Isso não funcionou porque busca de dados tem um atraso, certo? Então essa coisa demorou 2 segundos para retornar. Está bem? Mas o que aconteceu foi que isso foi executado antes de retornar, certo? Isso tem um atraso de 2 segundos. Então, essa coisa não esperou que terminasse de ser executada e voltasse com o resultado Em vez disso, ele executou isso primeiro. Certo? Então, o que aconteceu é que ficamos indefinidos Então os dados foram retornados, mas esse código foi executado e isso não funcionou como esperado, certo? Agora imagine ter uma chamada de API aqui, chamada de API real em vez de um tempo limite aqui Estou recebendo uma chamada de API e estou obtendo alguma resposta do servidor Agora, preciso ir. Preciso esperar para receber a resposta do servidor, certo? Não posso simplesmente prosseguir diretamente para a próxima etapa, certo? E é aqui que os retornos de chamada entram em cena, certo? Essa é uma necessidade de retorno de chamada. Então, este exemplo, você pode ver, assumindo que aqui você está tendo algum tipo de operação que está causando algum tipo de atraso Ok, de cerca de 2 segundos. E simulamos esse atraso com a ajuda dessa função de tempo limite definida Então, supondo que você esteja tendo uma operação que está causando um atraso, ok, é assim que as coisas funcionariam sem retornos de chamada, Portanto, você precisa de um retorno de chamada, que é uma função passada como argumento para outra função e executada após conclusão de um determinado evento ou operação Agora, qual é o evento no nosso caso? O evento em nosso caso é essa operação de busca ou essa operação atrasada que estamos tendo Está bem? Então, como as coisas funcionariam? Deixe-me atualizar esse exemplo aqui, ok? Então, o que eu faria é receber um retorno de chamada aqui, algo assim Ok. E o que podemos fazer é me deixar ou, você sabe, em vez de modificar este exemplo, eu simplesmente copiaria este exemplo, ok E criaríamos, eu manteria esse exemplo intacto e teria um retorno de chamada aqui, ok? E eu vou dizer com uma ligação aqui. Ok, então estou fazendo isso para que tenhamos os dois exemplos e possamos diferenciar qual é a diferença. Está bem? Então você pode ver aqui fetch data e eu estou chamando fetch data com Está bem? Então, busque dados com retorno de chamada, eu posso ter um retorno de chamada aqui Está bem? Isso é um retorno de chamada. Ok. Agora, aqui, posso aqui chamar esses dados do processo com retorno de chamada, ok? E isso está sendo chamado daqui. Agora, como eu modificaria isso é usar esses dados como um parâmetro aqui. Ok, eu me livraria disso aqui. Ok. Portanto, essa é a função de retorno que seria executada quando a operação fosse concluída Então, essa operação de tempo limite, uma vez concluída, o que precisamos fazer é imprimir os dados, certo? Então, estou aceitando dados como um parâmetro aqui e estou fazendo um log do console, ok. O que eu faria é sempre que chamasse esses dados do processo, com retorno de chamada O que eu faria é, em vez de chamar isso, eu diria buscar dados com retorno de chamada aqui Eu chamaria imediatamente essa função aqui e passaria isso como argumento, essa função Então, estou usando retornos de chamada agora. E se eu salvar isso, ok, deixe-me adicionar algo aqui com retorno de chamada. Está bem? E isso é feito com o retorno e eu estou recebendo os dados. Vou adicionar um coolin. Está bem? Agora, aqui, ao invés de voltar, o que eu posso fazer é dizer aqui. Eu tenho que criar dados primeiro, ok? Então, eu vou dizer dados. É igual a algo assim. Então, esses são os dados. Então, digamos que esses são os dados que estão sendo retornados do servidor. Agora vou pegar esses dados e dizer callback e passá-los para os dados, algo assim Se eu salvar isso, você verá que o primeiro é indefinido. Você pode ver os dados do servidor, os dados do servidor, e aqui você vê com o retorno de chamada, certo? Portanto, os dados do servidor estão sendo impressos duas vezes por causa desse log do console. Então, se eu me livrar disso e salvar isso, você verá os dados do servidor. Então, este é um, e então você tem com dados de amostra de retorno de chamada aqui Então, espero que esteja claro qual é o uso do retorno de chamada aqui, qual é o caso de uso Então, aqui, essa era uma função que deveria ser executada quando os dados fossem retornados com sucesso. Está bem? Então aqui, se você ver quando os dados foram retornados com sucesso, essa função estava sendo executada, como um código dentro disso, certo? Então, em vez de fazer isso, o que fizemos foi passar essa função em si. Então aqui você pode ver que essa função em si está sendo passada aqui para outra função, ok? Essa é uma função que está interagindo com a API ou realizando algum tipo de operação que está causando atraso, ok? E aqui, essa função está sendo passada como um retorno de chamada. Ok. Então, quando a operação estiver concluída, a função de retorno de chamada está sendo chamada com os dados e os dados estão vindo aqui e imprimindo os dados aqui, certo? Então, espero que isso esteja claro. Então, em vez de ficar indefinido agora, o que está acontecendo é que toda essa operação está esperando Ele está aguardando 2 segundos até que os dados sejam buscados. E então esses dados do processo com retorno de chamada são chamados junto com os dados recebidos do servidor e, em seguida, são impressos no controlador, seja qual for a operação que você deseja realizar e que possa ser adicionada aqui Ok. Então é assim que o retorno de chamada funciona, e espero que esteja claro por que isso é importante Está bem? Agora, mais uma coisa que quero mostrar aqui, você pode ter retornos de chamada, como retornos de chamada para sucesso, bem como erros, ok Então isso é algo que eu gostaria de mostrar a todos vocês. Está bem? Então, o que você pode fazer é antes de usar retornos de chamada com sucesso e erros, eu também quero mostrar uma sintaxe aqui, que é de funções de retorno de chamada anônimas Ok. Então, aqui, o que estamos fazendo está aqui neste exemplo específico, se eu copiar isso. OK. Isso não é anônimo, certo? Então, deixe-me atualizar esses dois. OK. Eu vou dizer nada aqui. OK. E este também não Este também não está aqui. OK. Espero que tudo esteja atualizado. Tudo bem Agora, o que está acontecendo é que estamos realmente passando essa função para essa função específica aqui, certo? Assim, podemos encurtar a sintaxe. O que eu posso simplesmente fazer é simplesmente cortar isso, aqui, eu posso simplesmente dizer função. Eu posso simplesmente aceitar dados aqui e posso simplesmente fazer isso, opa, eu não precisava de uma frase encaracolada, eu posso simplesmente colar isso assim Está bem? Agora, isso não é necessário, é assim que a sintaxe se torna, com anonimato Posso dizer que não há nada aqui. Eu posso salvar isso e você verá os dados do servidor com retorno de chamada sem, você pode aumentar isso para 3 segundos. Vamos ver como isso funciona. Tudo bem Você pode ver dados do servidor, dados com retorno de chamada e dados sem Ou se eu atualizar isso para 10 segundos, ele deve funcionar bem. Ok, na verdade, um erro aqui, isso é chamar fetch data com callback OK. Então, ainda está se referindo à função interessante, mas vou atualizá-la também com Annan aqui Eu queria saber por que não está refletindo as mudanças em segundos. Então você pode ver aqui depois de 10 segundos. Agora com Annan, será refletido aqui Você pode ver. Ok, você pode ver. Portanto, funcionou perfeitamente bem com uma sintaxe mais curta. Portanto, este é um exemplo de funções de retorno de chamada anônimas. Está bem? Agora, gostaria de falar sobre retornos de sucesso e erros Agora, haverá cenários em que, se você estiver fazendo uma ligação para a EPA, tudo bem, existe a possibilidade de as coisas serem bem-sucedidas e não serem bem-sucedidas, certo Então, vou copiar isso aqui. Digamos que há uma operação que queremos realizar. Ok. Eu vou dizer com erro de sucesso, algo assim. Você pode ter dois retornos de chamada aqui. Sucesso, retorno de chamada e você pode ter erro, retorno de chamada, algo assim OK. Então, o que acontece é que aqui dentro, dentro do tempo limite definido, você pode ter algum código Digamos que eu tenha um código. Requeijão. Ok. Ocorreu um erro , digamos que vou manter esses dois verdadeiros. Digamos que seja um valor booleano aqui. OK. Agora, opa, se ocorreu um erro , o que eu preciso fazer é ligar para o Success callback, certo Retorno de chamada bem-sucedido com alguns dados, posso passar alguns dados, como erro Cordão ou algo parecido. Está bem? E se esse não for o caso, então eu posso dizer “sim” aqui. OK. E em vez disso, eu posso dizer, ok, então se não for um erro, então provavelmente você pode ter a coisa normal acontecendo assim. Ok, você pode ter isso. E em vez de chamar o callback aqui, você dirá, opa, isso não deve ser Isso deve ser um retorno de chamada bem-sucedido. E, na verdade, se for um erro, você chamará o callback de erro aqui, algo assim, certo? Então é assim que as ligações serão, certo? E você pode ver, então vamos mudar isso para quatro, ok, 4.000 milissegundos aqui. OK. Agora, o que você pode fazer é criar esses dois retornos de chamada também aqui Está bem? Então, aqui, eu posso dizer função. OK. Então, trabalhe com sucesso dessa forma e você pode dizer os dados aqui. OK. E aqui abaixo, você pode dizer que não confirma. Deveria ser o log de pontos do console aqui, e você pode dizer sucesso. Ok. E você pode imprimir dados no console. OK. Agora, a mesma coisa que você também pode duplicar por erro Então você pode dizer, sem erro, OK, assim. E em vez de sucesso, você pode dizer erro e ele exibirá os dados. Está bem? Então, essas são duas funções. Agora, o que você pode fazer é chamar isso, ao chamar os dados de busca Então, se você diz buscar dados com sucesso e erro, você pode dizer sobre sucesso: OK Sobre o sucesso em primeiro lugar porque você tem o retorno de chamada de sucesso definido primeiro, certo? E então, em caso de erro, algo assim. Agora, se você salvar isso, não verá nenhum erro sendo impresso porque simulamos a situação de erro Você pode ver que ocorreu um erro de erro, certo? Então você pode ver, e isso está sendo impresso. Ocorreu um erro de erro, certo? Agora você pode atualizar esse exemplo para o exemplo de função anônima. Então, primeiro de tudo, esse é um exemplo de sucesso e erro. Está bem? Você também pode randomizar isso, para que eu possa usar pontos matemáticos aleatórios Pontos matemáticos aleatórios aqui. OK. Se você disser pontos matemáticos aleatórios, é um método dentro de um objeto matemático. Então você pode ver que está me dando valores aleatórios de 0 a 1. Você pode ver aqui no console. OK. Agora posso dizer que pontos matemáticos aleatórios são menores que 0,5. Isso me dará um valor booleano, verdadeiro, às vezes verdadeiro, às vezes falso Então eu posso ter essa condição copiada e adicionada aqui. Está bem? Então, essa condição de erro ocorreu agora é dinâmica, certo? Então, se eu salvar isso, você pode ver o erro, você pode ver o erro e sucesso será praticamente dinâmico. Agora, se eu salvá-lo novamente, agora foi uma situação de erro , também pode ser um sucesso. Está bem? Você pode ver exemplos de dados de sucesso, certo? Você pode atualizar isso para uma função anônima, então eu posso cortar isso aqui. OK. Você pode dizer assim. OK. E então você tem isso aqui. OK. Então isso está feito, ok? E então você também pode ter o erro. Agora, você também pode encadear retornos de chamada, ok? Então, deixe-me mostrar como você pode fazer isso. Está bem? Então, retornos de chamada encadeados. Tudo bem Então, digamos que eu tenha uma função. Ok, então eu vou ter essa função aqui. OK. Deixe-me chamar isso. Oh, desculpe. Deixe-me copiar isso. Então, vou chamar essa função como etapa um. Ok, tem um retorno de chamada, defina o tempo limite. E aqui, vou colocar o registro do console aqui, que diz o primeiro passo até aqui. Ok, algo assim. Estou ligando. Também estou recebendo um retorno de chamada aqui, que não aceita um parâmetro OK. E em vez de 10.000, vou ficar com milhares aqui. Então essa é uma função que eu tenho com um retorno de chamada. Esse é o primeiro passo. Digamos que eu tenha uma etapa dois. Então, eu estou fazendo um conjunto múltiplo de operações aqui. Está bem? Esse é o segundo passo. Eu vou dizer que esta é a segunda etapa novamente aqui. OK. Eu virei aqui novamente. Eu vou dizer que esta é a etapa três, algo assim. Esta é a etapa três novamente aqui. OK. Então, por aqui. Agora, o que eu posso fazer é dizer o primeiro passo. Então, o primeiro estilo é chamado de primeiro passo. OK. No primeiro passo, eu vou ter uma função de seta como esta, e aqui eu posso dizer o passo dois. Então, dentro da função de seta, direi a etapa dois. Agora, a etapa dois precisa de um parâmetro. Em vez disso, vou passar uma função de seta aqui novamente. OK. E então aqui, terei novamente a etapa três, algo assim. Eu vou dizer algo assim. Assim e aqui, assim. OK. E aqui, vou apenas mencionar o log de pontos do console , tudo bem? Algo parecido. Tudo concluído. Eu vou dizer passos, ok? Vou adicionar ponto e vírgula aqui. E eu vou ver o CV Okay. Agora você vê a etapa um concluída, etapa dois concluída, a etapa três concluída e todas as etapas concluídas. Tudo bem. No final, você vê dados de amostra de sucesso porque o tempo limite era muito maior, sim E esse também teve um tempo limite maior, certo? Mas aqui você pode ver que os passos um, dois e três foram concluídos, ok? E é assim que você pode fazer uma operação que envolve várias operações assíncronas Agora, também, gostaria de destacar mais uma coisa aqui, como essa coisa de encadear retornos de chamada, também conhecida como inferno de retornos de chamada Então, se você pesquisar no Google ou se estiver lendo sobre JavaScript ou retornos de chamada, encontrará esse termo chamado Inferno de retornos de chamada, e é isso que é Em que você está encadeando retornos de chamada ou criando uma pirâmide de retornos de chamada, em que os retornos de chamada estão aninhados uns nos outros Então, eles estão aninhados um dentro do outro. Agora, essa não é uma prática recomendada, certo, porque também está tornando o código mais difícil de ler e manter. Então, qualquer pessoa lendo seu código amanhã, ok, seria difícil para ele entender o que está acontecendo aqui, certo? E se você tiver mais call wax ou mais operações assíncronas, mais códigos APA fazendo , seria ainda mais difícil e você poderia até cometer erros como desenvolvedor Certo? Então, sim, isso é o inferno do callback Não é uma prática recomendada, mas eu gostaria de explicar e ensinar esse conceito para todos vocês, ok? Agora, você pode até mesmo usar retornos de chamada, ok, use retornos de chamada com métodos de matriz Está bem? Portanto, as matrizes têm alguns bons métodos que são úteis aqui Está bem? Deixe-me demonstrar isso para você, que eu possa dizer números aqui ou eu deveria dizer números. OK. E eu tenho um, dois, três, quatro, cinco e seis, ok. OK. Agora, você pode dizer, digamos que desejamos dobrar ou obter uma matriz em que cada número seja dobrado nessa matriz Então, posso dizer que vamos dobrar os números, ok. E aqui, o que eu posso fazer é dizer números ensinados a mapear. Ok, então eu vou ter um mapa aqui, e aqui eu posso ver a função. Eu vou ter uma declaração de função. Isso não terá nome. Você pode até criar uma função usando funções de seta, mas eu estou fazendo isso dessa maneira e você pode ver os números retornados em dois, algo assim. Você está apenas dobrando o número aqui. Está bem? E então aqui, você está vendo o log do console. Ok, então eu vou apenas dizer que vá aqui. E você pode dizer números duplos, algo assim. OK. Então, agora, ok, estamos recebendo um erro que a referência numérica não está definida. Está bem? Então, números de função. Ok, então isso tem que ser números. Ou você pode chamar isso de número, ok, não números. De qualquer forma, números é o nome da matriz. Então, se você salvar isso, verá que essa é a saída. Está bem? Então, o que está acontecendo é essa função de mapa está recebendo callback como entrada, ok, porque isso também é função e isso também é função Você pode ver? Então é assim que está operando. Está bem? Portanto, os métodos de mapeamento usam uma função de retorno de chamada e a aplicam a cada elemento nas matrizes Tudo bem? Então, sim, isso é sobre retornos de chamada, tudo bem. Agora, voltando à teoria, ok? O que são retornos de chamada? Então você está bem claro agora. Os retornos de chamada são uma função que é passada como argumento para outra função e executada após a conclusão de um determinado evento ou operação Portanto, eles permitem que você controle a ordem de execução, gerencie várias tarefas e também responda aos eventos, certo? Mas lembre-se de que o uso excessivo de retornos de chamada aqui, como vimos, pode levar ao inferno dos retornos de chamada Ok, e isso não é uma boa prática, certo? Então, sim, esses são retornos de chamada e espero que tenham sido úteis 4. Promessas desbloqueadas: escrevendo um código assíncrono mais limpo e gerenciável: Então, agora é hora de falarmos sobre promessas e como elas podem facilitar nossa vida. Então, como diz a definição aqui, promessas fornecem uma maneira mais limpa e estruturada de lidar com operações assíncronas Claro, quais são esses métodos, falaremos sobre eles. Mas primeiro, vamos entender o que são promessas. Portanto, sempre que você estiver fazendo uma operação assíncrona, uma forma de realizá-las é com retornos Então, se eu pagar algum código aqui, essa é uma operação assíncrona que está acontecendo, e eu estou fazendo uso de retornos de chamada Então você pode ver que essa é uma função que está fazendo a operação. Estou aceitando um parâmetro chamado callback e tenho essa operação assíncrona em que você pode assumir que estou buscando alguns dados do EPI, e esses são os dados que e esses É um objeto. E então eu estou chamando essa função de retorno de chamada aqui quando esses dados são buscados, certo Agora, essa função de retorno de chamada é na verdade, essa função que está sendo passada Então, quando estou chamando G data, estou passando essa função anônima com a ajuda da sintaxe da função de seta, e você pode ver que ela está sendo chamada quando a opção Obter dados é concluída Então, se eu salvar isso, você verá depois de 1 segundo esses dados estão sendo impressos no console. Então, isso são retornos de chamada, mas promessas uma abordagem melhor sempre que você estiver trabalhando com operação assíncrona Porque se você estiver fazendo muitas operações assíncronas , o retorno de chamada pode levar ao inferno do retorno de chamada, onde pode ser difícil gerenciar diferentes retornos inferno do retorno de chamada, onde pode ser difícil gerenciar diferentes retornos de chamada quando os usa extensivamente, certo? Portanto, as promessas são uma abordagem melhor. Agora, deixe-me converter esse exemplo em um exemplo com promessas, ok? Então, vou escrever o mesmo exemplo que estou realmente obtendo esses dados JCN de, digamos, um servidor, e farei isso com a ajuda de promessas, ok? Então, vou copiar essa função, primeiro de tudo, ok? E eu vou me livrar dessa parte aqui, porque é isso que vamos mudar. Agora, em vez de ter esse tempo limite e depois fazer um retorno de chamada ou fazer uma chamada para essa função de retorno de chamada, o que vou fazer é remover isso Eu vou dizer: devolva uma nova promessa, ok? Prometo, algo assim. OK. Agora, se você passar o mouse sobre isso, deixe-me ver se temos uma documentação Ok, você pode ver aqui. Então isso é uma promessa, ok? E você terá uma promessa aqui, você terá uma função, ok? Então, aqui dentro, eu vou ter uma função de seta para encontrar assim. OK. Assim. Tudo bem, e eu vou adicionar um ponto e vírgula aqui OK. Agora, essa promessa precisa dessa função e, dentro dessa função, você precisa de dois parâmetros. Agora, quais são esses parâmetros? Uma será resolvida e a outra será a reverificação do nome aqui Está bem? Agora, por que temos determinação e por que temos reverificação Agora, sempre que você estiver fazendo uma operação assíncrona, podem ocorrer dois estados Uma delas é que a operação assíncrona foi bem-sucedida. E o segundo estado pode ser que a operação assíncrona que você executou não tenha sido bem-sucedida Está bem? Então, aqui, se você ver um pouco de documentação, verá que você tem dois argumentos ou um retorno de chamada resolvido Resolvido significa que a operação foi bem-sucedida Portanto, resolver é apenas um termo usado para dizer que o retorno de chamada ou qualquer outra operação que tenha ocorrido foi bem-sucedida, o e rejeitar, o que significa que o erro aconteceu ou, por algum motivo, a operação não foi bem-sucedida Então, estamos tendo dois retornos de chamada aqui , resolva e verifique novamente Está bem? Agora, o que vamos fazer aqui é que eu vou ter a lógica. A operação assíncrona vem aqui. Então, qual é minha operação assíncrona? Vou pegar essa operação assíncrona, vou adicioná-la Está bem? Agora, mais uma mudança que precisamos fazer é aqui que estamos chamando de callback, certo? Então, vou me livrar do retorno de chamada por aqui. Não precisamos de retorno de chamada. E em vez de ligar de volta, direi resolver. Por aqui, algo assim. Então, o que estou fazendo é que, quando a operação estiver concluída, estou dizendo para resolver essa chamada em particular . Isso é o que eu estou fazendo. Está bem? E a resolução será chamada e, em seguida, quem for o chamador, poderemos executar as próximas etapas Então, o que eu posso fazer aqui é dizer obter dados, assim. Ok, então eu vou ligar para obter dados. Mas agora isso está retornando uma promessa, certo? Então eu posso dizer ponto. Agora, existem dois métodos que você precisa conhecer e descobrir aqui. OK. Agora, o que é então? Se você esperar, talvez eu veja sua documentação. Ok, eu não estou vendo eles. Mas então, na verdade , é a conclusão bem-sucedida dessa promessa. Está bem? E se você quiser lidar com erros, precisará fazer isso no cache. Então aqui você pode ver, Data, e eu vou ter uma função de seta aqui, algo assim, e eu vou dizer log aqui. Ok, e eu vou dizer dados, algo assim. OK. E então eu posso copiar essa mesma coisa aqui. Em vez de Tita, eu posso ver um erro aqui, assim. E em vez do log de pontos do console, posso registrar o erro nesse formato e salvá-lo. Está bem? E você pode ver a saída aqui. Está bem? Você pode ver que a saída que estou recebendo é apenas uma. Idealmente, eu deveria comprar dois, um para isso e outro para este Mas parece haver um problema porque os nomes das funções são os mesmos aqui. G data, obtenha dados, em qualquer lugar, obtenha dados. OK. Então, vou ligar para esse, obter dados. OK. Vou ver com promessa aqui, algo assim. OK. E em vez de chamar get data aqui, direi get data com promessa. Tudo bem? Então, agora há algum tipo de separação nos nomes aqui. Isso é obter dados, e isso é obter dados com promessa. E se você salvar isso, verá que este é do primeiro e este é do segundo. Está bem? Então, funciona perfeitamente bem, e você pode ver o que aconteceu aqui. Está bem? Então, o que fizemos foi definir essa função get data with promise com um retorno aqui. Então, isso é um retorno. Está retornando uma promessa agora. Certo? Agora, dentro do construtor de promessas Então, ao chamar essa promessa ou ao criar essa promessa, dentro desse construtor, simulamos uma operação assíncrona de recuperação de dados ou ao criar essa promessa, dentro desse construtor, simulamos uma operação assíncrona de recuperação de dados usando o tempo limite definido. Ok, então qualquer operação que você esteja fazendo entrará no construtor é algo que você precisa ter em mente OK. Agora, uma vez que os dados sejam recuperados aqui, ok? Depois que os dados forem recuperados, ligamos para resolver aqui OK. Agora, a função resolve é chamada aqui para cumprir a promessa com os dados de recuperação Então, estamos passando os dados também porque queremos cumprir essa promessa agora com os dados recuperados E então o que acontece é que quando você liga para get data with promise aqui, ok? Você está aproveitando isso e pegando aqui. Portanto, esses são dois métodos que podem ajudá-lo a lidar com o cumprimento bem-sucedido da promessa ou com o fracasso da promessa Então, está sendo usado para lidar com o cumprimento bem-sucedido Então, aqui, se você rolar para cima quando a promessa for cumprida e entender quando a promessa for rejeitada. Assim, você pode ver se há algum erro, a promessa é rejeitada e o cache será executado. Está bem? Portanto, você pode ver que essa é a sintaxe da promessa e, dessa forma, eles fornecem uma maneira mais limpa e estruturada de lidar com operações assíncronas Tudo bem. Lembre-se de que a operação que você deseja fazer, ok, será exibida aqui dentro do construtor Você pode ver tudo isso aqui, tudo isso está dentro do construtor de promessas Está bem? Então essa é a promessa. E então, se eu ver o controle, C, você pode ver que tudo isso está acontecendo dentro do construtor Isso é o que você deve ter em mente. Agora, essa definição está ficando um pouco complicada porque diz apenas que fornece uma maneira mais limpa e estruturada lidar com essas operações de sincronização. Está bem? Portanto, você também pode pensar nas promessas dessa forma as promessas realmente representam um valor que pode estar disponível agora. Pode estar disponível no futuro ou pode nunca estar disponível porque, se estiver disponível agora, tudo bem, está disponível. Se não estiver disponível, está sendo buscado, certo? Então isso é um estado. E se nunca estiver disponível, significa que ocorreu um erro. Então, esses são os três estados que normalmente uma promessa teria. Certo? Então, sim, isso é sobre a promessa. Agora, deixe-me mostrar o cenário de falha também aqui. Ok, então o que eu vou fazer é vir até aqui. Vou apenas duplicar esse código aqui com promessas e vou adicionar dois pontos Eu vou dizer sucesso e fracasso aqui, algo assim. Vou chamar isso de tudo como um. Uma delas é apenas diferenciar o nome da função para que não haja conflitos como tais Está bem? Então, estamos trabalhando com isso agora, um. OK. Portanto, obtenha dados com a promessa número um. Agora, aqui, eu vou ter, digamos, uma taxa de sucesso, sucesso ou fracasso definida. OK. Então, dentro do tempo limite, posso dizer que deixe o sucesso. Ok, então eu terei uma taxa de sucesso de 50%. Então, eu vou dizer pontos matemáticos aleatórios aqui. E se a matemática aleatória for menor que 0,5, ok? Então, isso dará uma resposta verdadeira ou falsa. Então, o sucesso terá um valor booleano, seja verdadeiro ou falso, certo? E então aqui, o que eu posso fazer é dizer se a declaração está aqui, ok? E eu posso dizer se foi sucesso. Tudo bem, então estamos recebendo esses dados, mais ou menos. Vou mover isso para dentro. Tudo bem. E se não der certo, então eu tenho um bloco s aqui. OK. E dentro de mim, posso dizer que rejeito. Está bem? Então, resolva para que serve a resolução? Resolver é resolver a promessa. Significa que a busca de dados foi bem-sucedida Resolva essa promessa Agora, se ocorrer um erro, você ligará para rejeitar aqui e passará uma mensagem. Você pode passar uma mensagem. Você pode fornecer qualquer motivo, como erro e algum motivo, aqui. Então, vou apenas dizer algum motivo. OK. Você pode adicionar o motivo dependendo do seu cenário, tudo bem. Mas é assim que vai ser, ok? E eu tenho FLs e não há mais nada. Está bem? Então, agora, se você salvar isso para ter sucesso aqui. Se você salvar isso novamente, vamos ver, você pode ver um erro por algum motivo. Então essa condição falhou e você está recebendo um erro aqui. Então, essa promessa falhou, na verdade. Está bem? Então é assim que você pode lidar com o sucesso e os fracassos. Está bem? Então, se você quiser, se tiver um cenário, não lidamos com esse cenário, apenas dissemos resultado. Está bem? Então, apenas cuidou do resultado. Mas agora, se houver um erro ou algo parecido, você pode, por exemplo, verificar os dados que está recebendo do servidor. Se os dados recebidos forem nulos, você poderá dizer rejeitar e haverá algum erro Está bem? Então, nesse caso, se a rejeição estiver sendo chamada, o cache será executado aqui, e tudo o que estiver lá no cache será executado. Tudo bem. Então, sim, este é um exemplo de sucesso e fracasso com promessa. Agora, ao trabalhar com promessas, haverá cenários em que talvez você queira executar um trecho de código, independentemente de a promessa ser cumprida ou rejeitada, certo? Então, nesse caso, você finalmente tem isso, ok? Você pode dizer que finalmente está aqui. OK. E de forma semelhante, como se você tivesse definido as outras duas coisas, você pode dizer console dot log, o, e você pode dizer, finalmente. OK. Gostaria apenas de acrescentar esta mensagem. Está bem? Você pode ter qualquer tipo de mensagem aqui. Portanto, isso será executado independentemente de haver sucesso ou fracasso Então, se eu salvar isso, você vai ver finalmente, ok? E você pode ver que há uma falha. Está bem? Se eu salvar isso novamente, ok, estou recebendo a mesma saída. Ok, isso é novamente um fracasso. Você pode ver que desta vez é um sucesso e, finalmente, também consegue. Está bem? Então, finalmente, também faz parte. Mas sim, a coisa principal se resolve nessa época e pega aqui Está bem? Agora, deixe-me mostrar mais um cenário, ok, em que você pode querer ter várias promessas juntas Então, vamos dar um exemplo em que queremos executar várias promessas em paralelo Está bem? Então você pode dizer várias promessas aqui. OK. Agora, deixe-me criar várias promessas. Eu vou dizer, vamos prometer um. Está bem? Como você criaria isso? Você acabou de ligar para buscar dados com a promessa, ok? Portanto, busque dados com promessa. OK. Deixe-me copiar isso. Ok, não é buscar, na verdade, é obter dados com a promessa um. Desculpe por isso. OK. Então, sim, eu chamo isso de ok. E nessa chamada, ele retornará um objeto prometido. Ok, então eu estou trazendo isso aqui. Está bem? Então isso é um, isso é dois e isso é três. Preciso renomear isso. Serão dois, e isso é três. Tudo bem. Então, três promessas criadas. Agora, digamos que eu deseje que todas essas três promessas sejam executadas em paralelo. Então, o que eu posso fazer é dizer promessa aqui no ponto A. Você pode ver todo esse método. E aqui, você pode passar uma matriz com a promessa um, promessa dois. E promessa três, algo assim aqui. OK. E então aqui, você pode dizer, então, mais ou menos, e você pode ter os resultados aqui. Está bem? Então, depois que isso for feito, digamos que eu queira fazer isso. OK. Então, eu vou ter isso e, em vez de você, posso dizer que está tudo pronto. OK. Então, eu vou terminar essa mensagem, algo assim. Está bem? Ou então você também pode adicionar um cache, para que eu possa copiar isso aqui. OK. E aqui eu posso adicionar um cache. Tudo bem. E isso terminará com ponto e vírgula. Então eu posso salvar isso. E você vai ver. Então esses dois são executados, ok? E espere. Deixe-me elogiar essas duas ligações porque agora estamos fazendo muitas ligações, ok? Portanto, você pode obter ou deixar que eu adicione um login do console no meio. OK. Então, o que eu faria é copiar esse log do console aqui. OK. E aqui, eu diria que vários. Algo parecido com isso. OK. Então, agora você veria que vários estão sendo impressos. Está bem? Ok, na verdade é uma chamada assíncrona Então, está sendo impresso no primeiro. OK. O que eu teria que fazer é desativar essas chamadas. Isso seria o melhor, eu acho. Está bem? Então, opa, desativaria isso também. OK. E eu desativaria este com sucesso e fracasso. Assim. OK. E vou ver se é isso. OK. Agora você pode ver que este foi rejeitado. OK. Então, estou recebendo esse erro. Deixe-me ver o cenário de sucesso aqui. OK. Então, estou recebendo apenas erros. OK. Tudo bem, então você pode ver tudo pronto aqui. E todas as três promessas foram bem-sucedidas. Você pode ver aqui. OK. Então é assim que é. Você pode adicionar se quiser. Não adicionamos uma mensagem personalizada para a falha. Você pode ver que pelo menos uma promessa falhou. Está bem? E se você salvar isso, verá que pelo menos uma promessa falhou. Então, uma coisa que eu gostaria de mencionar aqui é que, se alguma promessa falhar, ok, o resto também será marcado como falhado. Qualquer um falhar, se alguém falhar , você pode ver, você pode ver isso na saída aqui. Então, qualquer um está falhando, e essa é a razão pela qual você está recebendo essa falha como saída Agora, se eu executar isso de novo, ok, deixe-me dizer isso. Você pode ver agora que todos os três foram executados com sucesso. Então, você está vendo tudo pronto como saída. Está bem? Da mesma forma, há mais um método, que diz, que é o método racial. Está bem? Então, agora haverá um cenário em que você deseja usar o resultado ou encontrar a primeira promessa estabelecida, certo Então, nesse caso, o que você pode fazer é dizer o ponto da promessa como e, como se você tivesse a matriz de promessas aqui, você pode fazer isso. OK. E você pode ter uma sintaxe similar Então, ao invés de usar tudo, você está usando raios aqui. É isso, ok? E você pode ver isso feito, ok. E aqui você pode ver a raça. Então, vou apenas mencionar uma série em todos os lugares para que saibamos que essa saída é de s. Ok. Vou guardar isso. Então você pode ver a toca enquanto isso é feito. Então esse foi executado aqui. Isso é da raça. OK. Assim, você pode ver uma promessa falhada, erro e até mesmo uma promessa falhando. Está bem? Então, sim, é assim que raios e promessas funcionam, ok. Essencialmente, a corrida lhe dará a promessa de força que resolve e tudo o ajudará a executar ou cumprir todas as promessas em paralelo OK. Então, essas são promessas, e espero que isso tenha ficado claro. Então, em poucas palavras, promessas fornecem uma maneira mais limpa e uma abordagem mais estruturada para lidar com uma operação síncrona, ok Então pegue e , finalmente, estão alguns dos métodos que você pode usar, ok? E esses são os métodos que ajudam você a trabalhar com promessas. 5. async/await: a maneira moderna de lidar com JavaScript assíncrono: Então, agora é hora de começarmos a falar sobre async await. Agora, async e await nos ajudam a simplificar ainda mais nosso código assíncrono Agora, aqui, eu tenho um exemplo já escrito em que eu tenho essa função, que está retornando uma promessa, ok? E dentro da promessa, estamos realmente tendo esse código assíncrono ou em que estou simulando um atraso aqui de 1.000 de E eu tenho uma taxa de sucesso aqui de 50% escolhida aleatoriamente, e elas podem ser sucesso ou fracasso aqui, ok? E eu estou fazendo uso disso dessa forma. Então, se uma promessa for resolvida, ela está sendo usada e, se não for, se houver um erro, usamos catch. Portanto, essa é a sintaxe ao trabalhar com promessas. Agora, o problema aqui é que isso ainda não é legível. A maneira como você está consumindo isso não é legível. E com a ajuda dessas duas palavras-chave, você pode simplificar ainda mais isso. Tudo bem? Então, deixe-me dar um exemplo, então vou comentar isso, ok? O que posso fazer é dizer que eu queira consumir isso, obter dados. Então, o que eu posso fazer é dizer função aqui, e eu vou dizer buscar dados ou buscar dados, vamos chamá-lo, e eu vou buscá-los de forma sincronizada Ok. Agora, aqui, o que posso dizer é que posso dizer deixar dados e posso dizer obter dados aqui. Ok. Então get data é o nome da nossa função aqui. Está bem? Então, eu também chamarei isso de get data em vez de fetch data. Está bem? Então, eu tenho as coisas dessa maneira agora, e deixe-me também adicionar essa declaração de log aqui, log de pontos do console, na qual estou imprimindo dados Agora, é claro, vamos ver qual é a saída aqui. Ok. Então, não estamos recebendo nada aqui. Está bem? Então, o que eu faria é chamar essa função. Ok, esqueci de chamar essa função resumidamente. Ok. Eu veria se isso. Ok, então você está recebendo uma promessa agora, ok? Você não está recebendo o resultado, ok? Como você obteria o resultado? Então, para obter o resultado usando as palavras-chave Async e await, você pode usar async dessa forma e adicionar await aqui Assim. Ok. E você obteria os dados agora, você pode ver? Tudo bem Portanto, esta é uma sintaxe, bastante legível e muito mais simples do que Tudo bem? Então, isso ainda não é legível, e isso simplifica ainda mais Está bem? Agora, uma pia e um peso dependem um do outro. Se você tentar remover um coletor e tentar salvar, verá que o Aweight só é válido em funções de coletor Então você precisa ter uma pia. Se você tentar remover await aqui e tentar salvá-lo, receberá uma promessa e verá que isso é um erro Está bem? Portanto, você precisa usar os dois aqui para obter a saída certa. E você pode até mesmo fazer o tratamento de erros aqui. Assim, você pode usar o tratamento de erros. Você pode fazer o tratamento de erros com a ajuda do simple try catch, e qualquer erro que esteja recebendo, você pode registrá-lo dessa forma, algo assim. E você pode mover esse código para dentro. Ok. E aqui você pode dizer, eu posso adicionar um erro. Algo parecido com isso. Ok. Agora, se houver uma falha aqui, você verá essa mensagem de erro. Está bem? Você pode ver erros e erros por algum motivo. Tudo bem Agora, a vantagem aqui da sintaxe é uma: ela é legível Está bem? E a vantagem é que você pode executar várias operações assíncronas em paralelo Está bem? Então eu posso ter mais um aqui. Ok. Então, vamos chamar isso como vamos chamar isso de um aqui. Está bem? Eu vou dizer que este é um. Ok. E essa coisa eu vou adicionar aqui. Eu vou dizer que são dois. Ok. E vou mudar rapidamente o nome da variável aqui. Eu direi que esse é o primeiro dado. Esses são os dados dois. Isso se torna dados um, dados dois, deixe-me salvar isso e vamos ver. Você pode ver que isso é um erro. Agora, uma promessa falhou, certo? Então isso foi executado. O resto do bloco não foi executado. Mas se eu executar isso de novo, você verá uma e a segunda promessa falhou. Uma foi executada, mas a segunda promessa falhou. Anteriormente, a primeira promessa havia falhado. Deixe-me salvar isso de novo. Você verá um e dois. Desta vez, ambos tiveram sucesso, certo? Você pode ter operações paralelas como essa e, como você pode ver aqui ou pode é muito simples de entender e a sintaxe também é fácil. Está bem? Não há nada complicado envolvido. Está bem? Assim, você pode ver o primeiro campo. Então, é claro, nada será executado nesse bloco, certo? Então, vou guardar isso novamente. Deixe-nos ver. Ok. Mas em vez disso, deixe-me ligar assim ou, aumente a taxa de sucesso para, digamos, 90%. Um, dois e três. Então eu aumento a taxa de sucesso, e você pode ver que todos os três foram bem-sucedidos, certo? Então é assim que funciona e, chegando à documentação, acho que o Await simplifica o código assíncrono, fazendo com que pareça um código síncrono fazendo Então, parece um código síncrono, Javascript normal, ok, mais fácil de ler e mais fácil de manter E mesmo para ser grande, isso é bem simples, certo? As pessoas podem facilmente entender o que está acontecendo, ok? Então, com a ajuda do Await, estamos dizendo que espere que essa operação seja concluída porque essa é uma operação assíncrona Então ele espera, ele termina isso, então ele espera que isso seja Eu termino isso, então ele espera que isso seja concluído. E como estamos usando await, temos que marcar essa função como um coletor aqui Está bem? Portanto, melhora a legibilidade e facilita o tratamento de erros com o Try Catch Então, aqui, você tinha que usar o cache, imediatamente, e pegar. Agora, aqui, é bem simples, como JavaScript padrão, tente armazenar em cache, ok E você pode usar o asyncad com várias operações síncronas, solicitações asyncad com várias operações síncronas, solicitações HTTP e muito mais. Tudo bem Então, tudo isso é possível, e é incrível. Como essas coisas estão sendo muito usadas, se você estiver verificando qualquer código JavaScript ou se estiver trabalhando muito com EPIs, o que, é claro, acontecerá já que está aprendendo JavaScript, ok, você verá muitas dessas duas palavras-chave Tudo bem Então, esses dois são importantes. exemplo, se você quiser avançar no Javas Crave, você quer usar coisas como react e tudo mais, tudo bem, esses Await and a sink algo que você deve entender Tudo bem? Então, espero que isso seja útil e espero que você tenha conseguido acompanhar. 6. Conclusão do curso: Bem, parabéns. Você concluiu o domínio do JavaScript assíncrono e espero que tenha aprendido muito durante toda essa Espero que você esteja se sentindo muito mais confiante em sua capacidade de lidar com operações assíncronas com a ajuda de conceitos como retornos de chamada, promessas E espero que este curso tenha lhe dado uma nova perspectiva de como você pode escrever código assíncrono baseado em JavaScript para lidar com operações como chamadas de banco de dados, chamadas de EPI e outras coisas Agora, aqui está uma rápida recapitulação do que aprendemos. Nós cobrimos os retornos de chamada. Aprendemos sobre promessas e aprendemos como você pode usar esse conceito moderno para escrever operações assíncronas em JavaScript E também aprendemos sobre o ANC e o await e entendemos como você pode usá-los. Agora, espero que este curso tenha proporcionado a você uma boa experiência prática, porque não fizemos uso de nenhuma apresentação Tudo era estritamente restrito no IDE. E eu sei que desenvolvedores como você sempre adoram ou preferem programar e ter o editor sempre aberto na frente deles, porque é isso que fornece a experiência prática real antes de você começar a trabalhar em projetos do mundo real. Agora, depois de terminar este curso, eu recomendo fortemente que você continue praticando e utilizando os conceitos que aprendeu ao longo dos projetos nos quais está trabalhando . Obrigado por ser um grupo de alunos tão engajado Este curso vem com um projeto de classe, que você pode encontrar na seção de projetos deste curso específico. Eu recomendo que você conclua o projeto e compartilhe com toda a turma para obter mais feedback. E com isso dito, chegamos ao fim e desejo a você tudo de bom para os projetos de JavaScript nos quais você trabalha.