JavaScript é uma linguagem de programação de thread único, o que significa que só pode executar uma tarefa por vez. Isso se torna complicado com operações assíncronas, como busca de dados ou configuração de temporizadores, que podem bloquear o fluxo de execução e tornar seu aplicativo mais lento.
Para lidar com essas tarefas assíncronas sem congelar o thread, encontramos o Promise — uma ferramenta poderosa que simplifica a programação assíncrona. Com Promises, você pode gerenciar tarefas de longa duração com mais eficiência, escrever códigos mais limpos e legíveis e evitar o temido "inferno de retorno de chamada."
Neste artigo, pretendo familiarizá-lo com o que são Promessas, como funcionam e como simplificam a programação assíncrona.
Imagine que você está pedindo uma refeição em um restaurante. Depois de fazer seu pedido, você não espera na cozinha para que sua comida seja preparada. Em vez disso, você conversa ou aproveita o ambiente enquanto a cozinha prepara sua refeição ao fundo. O restaurante promete servir a comida assim que estiver pronta. Você pode confiar nessa promessa porque, eventualmente, uma de duas coisas acontecerá: ou sua refeição chegará (cumprida) ou a cozinha informará que não será possível concluir o pedido (rejeitado ).
Em JavaScript, Promessas funcionam de maneira semelhante. Quando você pede ao JavaScript para fazer algo que leva tempo, como buscar dados de um servidor, ele retorna uma Promessa. Esta Promessa não fornece o resultado imediatamente. Em vez disso, ele diz: “Entrarei em contato com você quando o trabalho estiver concluído.” Durante esse tempo, o restante do seu código continua em execução. Assim que a tarefa for concluída, a Promessa será:
Uma Promessa representa um valor que pode estar disponível agora, no futuro ou nunca. Possui três estados:
Para criar uma Promise, você usa o construtor Promise, que usa uma função (conhecida como executor) que possui dois parâmetros: resolver e rejeitar. A função de resolução é chamada quando a Promessa é cumprida, enquanto a função de rejeição é chamada quando é rejeitada.
const myPromise = new Promise((resolve, reject) => { // Simulating an asynchronous task (e.g., fetching data) const success = true; // Simulate success or failure if (success) { resolve("Operation completed successfully!"); // Fulfill the promise } else { reject("Operation failed."); // Reject the promise } });
Depois que uma Promessa for criada, você poderá decidir seu resultado chamando resolve ou rejeitar:
Depois de criar uma Promessa, o próximo passo é consumi-la. JavaScript fornece vários métodos para lidar com os resultados de promessas: .then(), .catch() e .finalmente(). Cada um desses métodos serve a um propósito específico e permite gerenciar com eficácia os resultados de operações assíncronas.
const fetchData = () => { return new Promise((resolve) => { setTimeout(() => { resolve("Data fetched successfully!"); }, 1000); }); }; fetchData() .then(result => { console.log(result); // Logs: Data fetched successfully! });
const fetchWithError = () => { return new Promise((resolve, reject) => { setTimeout(() => { reject("Error fetching data."); // Simulating an error }, 1000); }); }; fetchWithError() .then(result => { console.log(result); }) .catch(error => { console.error(error); // Logs: Error fetching data. });
fetchData() .then(result => { console.log(result); // Logs: Data fetched successfully! }) .catch(error => { console.error(error); // Handle error }) .finally(() => { console.log("Promise has settled."); // Logs after either success or failure });
Para ser conciso:
Um dos recursos mais poderosos do Promises é sua capacidade de serem encadeados, permitindo que você execute várias operações assíncronas em sequência. Isso significa que cada operação aguarda a conclusão da anterior antes de ser executada, o que é particularmente útil quando as tarefas dependem umas das outras.
Vamos dar uma olhada no seguinte exemplo:
const fetchUserData = () => { return new Promise((resolve) => { setTimeout(() => { resolve({ userId: 1, username: "JohnDoe" }); }, 1000); }); }; const fetchPosts = (userId) => { return new Promise((resolve) => { setTimeout(() => { resolve(["Post 1", "Post 2", "Post 3"]); // Simulated posts }, 1000); }); }; // Chaining Promises fetchUserData() .then(user => { console.log("User fetched:", user); return fetchPosts(user.userId); // Pass userId to the next promise }) .then(posts => { console.log("Posts fetched:", posts); }) .catch(error => { console.error("Error:", error); });
Neste exemplo, a função fetchUserData retorna uma Promise que é resolvida com informações do usuário. O valor resolvido é então passado para a função fetchPosts, que retorna outra Promise. Se alguma dessas promessas for rejeitada, o erro será detectado no método .catch() final, permitindo um tratamento eficaz de erros em toda a cadeia.
Concluindo, as promessas são uma parte crucial do JavaScript moderno, permitindo aos desenvolvedores lidar com operações assíncronas de uma forma mais estruturada e eficiente. Ao usar Promessas, você pode:
Ao implementar Promises em seus próprios projetos, você descobrirá que elas não apenas melhoram a legibilidade do código, mas também melhoram a experiência geral do usuário, mantendo a capacidade de resposta dos seus aplicativos. Espero que esta jornada pelos conceitos fundamentais do JavaScript tenha fornecido informações valiosas para os desenvolvedores. Boa codificação!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3