"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Programação assíncrona em JavaScript: retornos de chamada versus promessas versus assíncrono/espera

Programação assíncrona em JavaScript: retornos de chamada versus promessas versus assíncrono/espera

Publicado em 31/07/2024
Navegar:721

Asynchronous Programming in JavaScript: Callbacks vs Promises vs Async/Await

A programação assíncrona é um aspecto fundamental do JavaScript que permite aos desenvolvedores realizar longas solicitações de rede, operações de arquivo e outras tarefas demoradas sem bloquear o thread principal. Isso garante que os aplicativos permaneçam responsivos e fáceis de usar. JavaScript fornece três maneiras principais de lidar com operações assíncronas: retornos de chamada, promessas e assíncrono/espera. Neste artigo, nos aprofundaremos em cada um desses métodos, explorando sua sintaxe, uso e diferenças por meio de exemplos detalhados.

Índice

  1. Introdução à programação assíncrona
  2. Retornos de chamada
    • Sintaxe e exemplo
    • Vantagens e desvantagens
  3. Promessas
    • Sintaxe e exemplo
    • Encadeando promessas
    • Vantagens e desvantagens
  4. Assíncrono/Aguardar
    • Sintaxe e exemplo
    • Manipulação de erros
    • Vantagens e desvantagens
  5. Comparação e práticas recomendadas
  6. Conclusão

Introdução à programação assíncrona

Em JavaScript, operações que levam tempo para serem concluídas, como buscar dados de um servidor, ler arquivos ou realizar cálculos, podem ser tratadas de forma assíncrona. Isso significa que enquanto espera a conclusão de uma operação, o mecanismo JavaScript pode continuar executando outras tarefas. Isso é crucial para criar experiências de usuário eficientes e tranquilas em aplicativos da web.

Retornos de chamada

Sintaxe e exemplo

Callbacks são um dos primeiros métodos para lidar com operações assíncronas em JavaScript. Um retorno de chamada é simplesmente uma função passada como argumento para outra função, que será executada assim que uma operação assíncrona for concluída.

function fetchData(callback) {
    setTimeout(() => {
        callback("Data fetched!");
    }, 1000);
}

function displayData(data) {
    console.log(data);
}

fetchData(displayData);

No exemplo acima, fetchData simula uma operação assíncrona usando setTimeout. Após 1 segundo, ele chama a função displayData, passando os dados buscados como argumento.

Vantagens e desvantagens

Vantagens:

  • Simples e direto para pequenas tarefas.
  • Fornece uma maneira de executar código após a conclusão de uma operação assíncrona.

Desvantagens:

  • Pode levar ao "inferno de retorno de chamada" quando várias operações assíncronas são aninhadas, tornando o código difícil de ler e manter.
  • O tratamento de erros é complicado, pois os erros precisam ser gerenciados em cada retorno de chamada.

Promessas

Sintaxe e exemplo

Promessas foram introduzidas no ES6 (ECMAScript 2015) para resolver os problemas associados aos retornos de chamada. Uma promessa representa uma operação que ainda não foi concluída, mas é esperada no futuro. Pode estar em um dos três estados: pendente, atendido ou rejeitado.

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error("Error:", error);
    });

Neste exemplo, fetchData retorna uma Promise que resolve com "Data fetched!" após 1 segundo. O método then é usado para tratar o valor resolvido e catch é usado para tratar quaisquer erros.

Encadeando Promessas

As promessas podem ser encadeadas para realizar uma série de operações assíncronas em sequência.

function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

function processData(data) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(`${data} Processed!`);
        }, 1000);
    });
}

fetchData()
    .then(data => {
        console.log(data);
        return processData(data);
    })
    .then(processedData => {
        console.log(processedData);
    })
    .catch(error => {
        console.error("Error:", error);
    });

Neste exemplo, processData é chamado após fetchData e os resultados são tratados em sequência usando then.

Vantagens e desvantagens

Vantagens:

  • Evita o inferno de retorno de chamada, permitindo o encadeamento de operações assíncronas.
  • Fornece tratamento de erros integrado com catch.
  • Melhora a legibilidade e a manutenção do código.

Desvantagens:

  • Ainda pode se tornar complexo com várias chamadas then aninhadas.
  • O tratamento de erros em uma cadeia pode não ser trivial.

Assíncrono/Aguardar

Sintaxe e exemplo

Async/Await, introduzido no ES2017, fornece uma maneira mais legível e concisa de escrever código assíncrono usando Promises. A palavra-chave async é usada para definir uma função assíncrona, e a palavra-chave await é usada para pausar a execução até que uma promessa seja resolvida.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve("Data fetched!");
        }, 1000);
    });
}

async function displayData() {
    const data = await fetchData();
    console.log(data);
}

displayData();

Neste exemplo, displayData é uma função assíncrona que aguarda a conclusão de fetchData antes de registrar os dados.

Manipulação de erros

O tratamento de erros com Async/Await pode ser feito usando blocos try/catch.

async function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject("Failed to fetch data!");
        }, 1000);
    });
}

async function displayData() {
    try {
        const data = await fetchData();
        console.log(data);
    } catch (error) {
        console.error("Error:", error);
    }
}

displayData();

Aqui, se fetchData falhar, o erro será detectado e registrado pelo bloco catch.

Vantagens e desvantagens

Vantagens:

  • Simplifica o código assíncrono, fazendo com que pareça mais com código síncrono.
  • Melhora a legibilidade e a manutenção do código.
  • Simplifica o tratamento de erros com blocos try/catch.

Desvantagens:

  • Requer compreensão das promessas, já que Async/Await é construído sobre elas.
  • Ainda é relativamente novo, então alguns ambientes podem não suportá-lo totalmente.

Comparação e melhores práticas

Comparação

  • Callbacks: Adequado para tarefas assíncronas simples e de nível único, mas pode levar a um problema de retorno de chamada em cenários complexos.
  • Promessas: Melhore a legibilidade e a capacidade de gerenciamento, permitindo o encadeamento de operações assíncronas. Tratamento de erros integrado com catch.
  • Async/Await: Fornece a maneira mais legível e sustentável de escrever código assíncrono. Simplifica o tratamento de erros e se parece com código síncrono.

Melhores Práticas

  • Use Async/Await para a maioria dos cenários em que você precisa lidar com operações assíncronas. Ele fornece a melhor legibilidade e simplicidade.
  • Use Promises quando precisar executar várias operações assíncronas em sequência ou ao usar bibliotecas que retornam Promises.
  • Evite retornos de chamada, a menos que esteja trabalhando com código legado ou ao lidar com tarefas assíncronas muito simples.

Conclusão

A programação assíncrona em JavaScript é essencial para construir aplicativos responsivos e eficientes. Compreender as diferenças entre retornos de chamada, promessas e Async/Await permite que os desenvolvedores escolham a ferramenta certa para seu caso de uso específico. Embora os retornos de chamada sejam a forma mais simples de lidar com operações assíncronas, eles podem levar a códigos confusos. As promessas oferecem uma abordagem mais estruturada, mas o Async/Await fornece a solução mais elegante e legível. Seguindo as práticas recomendadas e compreendendo essas ferramentas, os desenvolvedores podem escrever código assíncrono limpo, de fácil manutenção e eficiente.

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/itsshaikhaj/asynchronous-programming-in-javascript-callbacks-vs-promises-vs-asyncawait-690?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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