‫Instrutor: Agora vamos realmente começar
‫a aprender como resolver o inferno de callback usando promessas.
‫E vamos começar usando uma promessa para a
‫solicitação de exibição do agente
‫em vez do retorno de chamada.
‫E isso vai funcionar porque a biblioteca de superagentes, na
‫verdade, oferece suporte para promessas prontas para o uso e,
‫portanto, podemos simplesmente usá-las aqui.
‫Para funções de nó, provenientes de pacotes de nós internos como
‫Read File, na verdade teremos que construir a promessa
‫nós mesmos, e faremos isso mais tarde na próxima aula,
‫ou assim.
‫Mas, por
‫enquanto, quero que você aprenda como consumir promessas
‫e só mais tarde como construí-las.
‫Ok, então, novamente, vamos começar
‫com a biblioteca de
‫super agentes e mais especificamente com o método get aqui.
‫Porque este método aqui realmente retorna uma promessa.
‫Portanto, sem entrar em muitos detalhes, por enquanto, uma
‫promessa basicamente implementa o
‫conceito de um valor futuro.
‫Então, basicamente, um valor que esperamos receber em algum momento
‫no futuro, é um pouco como
‫dizermos "Ei, servidor" ou "Ei, API, por favor, pegue
‫uma imagem aleatória de um cachorro" no fundo e deixe saber
‫quando você estiver pronto "e, em seguida, me
‫devolva os dados. " OK?
‫Portanto, essa imagem aleatória é o valor que
‫esperamos em algum momento no futuro.
‫E esse é exatamente o tipo de
‫solicitação que estamos fazendo usando uma biblioteca de
‫superagente neste exemplo.
‫Direito.
‫E o método get que usamos novamente retornará
‫automática e imediatamente uma promessa assim que iniciarmos a
‫solicitação.
‫Portanto, a promessa ainda não tem valor,
‫porque o servidor ainda está recebendo os dados
‫do servidor de forma assíncrona em segundo plano,
‫mas a promessa está imediatamente disponível
‫e basicamente nos prometendo que obterá alguns dados de volta
‫no futuro.
‫Ok, isso faz sentido?
‫E aquele estado da promessa naquele caso, logo
‫no início, é uma promessa pendente.
‫Então ainda está pendente, ainda
‫não voltou com nenhum dado, ok?
‫Então, aqui, neste ponto, já temos uma promessa com
‫a qual podemos trabalhar.
‫Agora, tudo o que precisamos fazer é consumi-los, o
‫que basicamente significa que devemos esperar que ele volte
‫com os dados.
‫E para fazer isso, usamos o método then nele.
‫Então, tudo o que fazemos é usar então e aqui,
‫passamos uma função de retorno de chamada.
‫Essa função de retorno de chamada será
‫então chamada assim que a promessa for cumprida e seu
‫trabalho for devolvido.
‫E esses dados ficam então disponíveis como um argumento para
‫esse retorno de chamada.
‫Agora gosto de chamar isso de resultado.
‫E então, novamente naquela função de retorno de chamada que
‫temos aqui, então temos esses dados disponíveis.
‫Então, vamos pegar tudo isso aqui e colocá-lo nessa
‫função de retorno de chamada e realmente
‫nos livrar disso.
‫Então, não precisamos mais disso,
‫e dê uma chance.
‫Agora você pode estar pensando, bem, ainda
‫estamos usando callbacks aqui, e sim, isso é verdade.
‫Portanto, isso não parece uma grande mudança por agora,
‫mas depois de transformarmos todo o exemplo aqui
‫em promessas, você
‫verá o grande impacto que as promessas terão em nosso código.
‫Basicamente, se tivermos várias promessas, poderemos encadear esses
‫callbacks uns com os outros, em vez
‫de aninhá-los.
‫O que já é uma grande melhoria.
‫Agora, uma coisa que esqueci de mencionar
‫antes é que uma promessa assim que retorna com os dados
‫é chamada de promessa resolvida.
‫Portanto, no início é uma promessa pendente
‫e, quando obtém os dados
‫com sucesso, é uma promessa resolvida.
‫No entanto, uma promessa resolvida nem sempre pode ser
‫bem-sucedida porque pode ter ocorrido um erro.
‫Portanto, dizemos que uma promessa resolvida pode ser
‫cumprida ou rejeitada.
‫A promessa cumprida, na verdade, tem um resultado que
‫queremos usar.
‫Enquanto uma promessa rejeitada é quando houve um erro.
‫Portanto, lembre-se da situação que tivemos
‫antes, em que tínhamos uma raça de cachorro errada.
‫Nesse caso, tivemos um
‫erro e resolvemos esse erro usando este trecho de código aqui.
‫OK.
‫Agora, a coisa com este método
‫then aqui é que ele realmente só lida com promessas
‫cumpridas, mas não faz nada se houver um
‫erro, porque para isso, na verdade, temos outro método.
‫Então, outro mecanismo para lidar com isso.
‫E esse é o método de captura.
‫Logo após o método
‫then, podemos encadear outro método chamado catch.
‫OK.
‫E então este será chamado se houver um erro.
‫Então, aqui, nós realmente temos acesso a esse objeto de erro.
‫Então, vamos prosseguir, pegar esse
‫trecho de código e
‫colocá-lo
‫aqui, e agora podemos nos livrar disso.
‫Porque, na verdade, neste método
‫then, não temos informações se
‫houve um erro ou não, porque ele só
‫é chamado caso a promessa seja bem-sucedida.
‫Então, se for uma promessa cumprida.
‫Ok, então é legal separar esses dois
‫casos automaticamente para nós.
‫Então, ao invés de ter aquele manuseio
‫estranho que
‫tínhamos antes, podemos simplesmente escrever toda a lógica para o caso
‫de sucesso, que é
‫o mais usual, porque normalmente esperamos que tudo
‫funcione bem, mas no caso de haver
‫um erro, podemos inserir alguma outra lógica aqui para este manipulador de erros aqui.
‫Portanto, mantemos isso bem separado.
‫Vamos mudar aqui novamente.
‫Salve este outro para executá-lo novamente.
‫E aqui temos Not Found, e
‫você vê que na verdade ele inseriu este método catch aqui
‫e não fez nenhuma
‫das coisas que estão neste método then.
‫Agora vá em frente e conserte isso aqui,
‫feche, salve
‫este aqui e
‫lá vamos nós.
‫Então é assim que consumimos promessas.
‫Então, começamos com este método aqui que retornou
‫uma promessa e assim por diante,
‫podemos encadear o método
‫then que trata basicamente do caso de
‫sucesso e, no final, também encadeamos o método
‫catch que lida com o malsucedido, portanto, o rejeitado, promessa.
‫Mas, como eu disse antes, ainda parece como
‫antes.
‫Direito?
‫Portanto, ainda temos essa função de retorno de chamada aqui,
‫então toda essa função de retorno de
‫chamada e também aqui dentro de nosso método then, temos essa função de
‫retorno de chamada do writeFile.
‫Então, vamos corrigir isso no próximo vídeo.