"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Programación asincrónica en JavaScript: devoluciones de llamada frente a promesas frente a asíncrono/espera

Programación asincrónica en JavaScript: devoluciones de llamada frente a promesas frente a asíncrono/espera

Publicado el 2024-07-31
Navegar:457

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

La programación asincrónica es un aspecto clave de JavaScript que permite a los desarrolladores realizar solicitudes de red largas, operaciones de archivos y otras tareas que requieren mucho tiempo sin bloquear el hilo principal. Esto garantiza que las aplicaciones sigan siendo receptivas y fáciles de usar. JavaScript proporciona tres formas principales de manejar operaciones asincrónicas: devoluciones de llamada, promesas y asíncrono/espera. En este artículo, profundizaremos en cada uno de estos métodos, explorando su sintaxis, uso y diferencias a través de ejemplos detallados.

Tabla de contenido

  1. Introducción a la programación asincrónica
  2. Devoluciones de llamada
    • Sintaxis y ejemplo
    • Ventajas y desventajas
  3. Promesas
    • Sintaxis y ejemplo
    • Encadenando promesas
    • Ventajas y desventajas
  4. Asíncrono/Espera
    • Sintaxis y ejemplo
    • Manejo de errores
    • Ventajas y desventajas
  5. Comparación y mejores prácticas
  6. Conclusión

Introducción a la programación asincrónica

En JavaScript, las operaciones que tardan en completarse, como obtener datos de un servidor, leer archivos o realizar cálculos, se pueden manejar de forma asincrónica. Esto significa que mientras espera que se complete una operación, el motor JavaScript puede continuar ejecutando otras tareas. Esto es crucial para crear experiencias de usuario eficientes y fluidas en aplicaciones web.

Devoluciones de llamada

Sintaxis y ejemplo

Las devoluciones de llamada son uno de los primeros métodos para manejar operaciones asincrónicas en JavaScript. Una devolución de llamada es simplemente una función pasada como argumento a otra función, que se ejecutará una vez que se complete una operación asincrónica.

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

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

fetchData(displayData);

En el ejemplo anterior, fetchData simula una operación asincrónica usando setTimeout. Después de 1 segundo, llama a la función displayData y pasa los datos obtenidos como argumento.

Ventajas y desventajas

Ventajas:

  • Simple y directo para tareas pequeñas.
  • Proporciona una forma de ejecutar código después de que se completa una operación asincrónica.

Desventajas:

  • Puede provocar un "infierno de devolución de llamadas" cuando se anidan varias operaciones asincrónicas, lo que dificulta la lectura y el mantenimiento del código.
  • El manejo de errores es engorroso, ya que los errores deben gestionarse en cada devolución de llamada.

Promesas

Sintaxis y ejemplo

Se introdujeron promesas en ES6 (ECMAScript 2015) para abordar los problemas asociados con las devoluciones de llamada. Una Promesa representa una operación que aún no se ha completado pero que se espera que se realice en el futuro. Puede estar en uno de tres estados: pendiente, cumplido o rechazado.

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

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

En este ejemplo, fetchData devuelve una Promesa que se resuelve con "¡Datos obtenidos!" después de 1 segundo. El método then se usa para manejar el valor resuelto y catch se usa para manejar cualquier error.

Encadenando promesas

Las promesas se pueden encadenar para realizar una serie de operaciones asincrónicas en secuencia.

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);
    });

En este ejemplo, se llama a ProcessData después de fetchData y los resultados se manejan en secuencia usando then.

Ventajas y desventajas

Ventajas:

  • Evita el infierno de las devoluciones de llamadas al permitir el encadenamiento de operaciones asincrónicas.
  • Proporciona manejo de errores integrado con captura.
  • Mejora la legibilidad y el mantenimiento del código.

Desventajas:

  • Aún puede volverse complejo con múltiples llamadas anidadas.
  • El manejo de errores en una cadena puede no ser trivial.

Asíncrono/Espera

Sintaxis y ejemplo

Async/Await, introducido en ES2017, proporciona una forma más legible y concisa de escribir código asincrónico usando Promises. La palabra clave async se usa para definir una función asincrónica y la palabra clave await se usa para pausar la ejecución hasta que se resuelva una Promesa.

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

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

displayData();

En este ejemplo, displayData es una función asincrónica que espera a que se complete fetchData antes de registrar los datos.

Manejo de errores

El manejo de errores con Async/Await se puede realizar usando bloques 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();

Aquí, si fetchData falla, el bloque catch detecta y registra el error.

Ventajas y desventajas

Ventajas:

  • Simplifica el código asíncrono, haciéndolo parecer más código síncrono.
  • Mejora la legibilidad y el mantenimiento del código.
  • Simplifica el manejo de errores con bloques try/catch.

Desventajas:

  • Requiere comprensión de las promesas, ya que Async/Await se basa en ellas.
  • Aún es relativamente nuevo, por lo que es posible que algunos entornos no lo admitan por completo.

Comparación y mejores prácticas

Comparación

  • Devoluciones de llamada: Adecuado para tareas asincrónicas simples de un solo nivel, pero puede llevar a un infierno de devolución de llamada en escenarios complejos.
  • Promesas: Mejora la legibilidad y manejabilidad, permitiendo encadenar operaciones asincrónicas. Manejo de errores integrado con catch.
  • Async/Await: proporciona la forma más legible y fácil de mantener de escribir código asincrónico. Simplifica el manejo de errores y parece código sincrónico.

Mejores prácticas

  • Utilice Async/Await para la mayoría de los escenarios en los que necesite manejar operaciones asincrónicas. Proporciona la mejor legibilidad y simplicidad.
  • Utilice Promesas cuando necesite realizar varias operaciones asincrónicas en secuencia o cuando utilice bibliotecas que devuelvan Promesas.
  • Evite las devoluciones de llamada a menos que trabaje con código heredado o cuando se trate de tareas asincrónicas muy simples.

Conclusión

La programación asincrónica en JavaScript es esencial para crear aplicaciones receptivas y eficientes. Comprender las diferencias entre Callbacks, Promises y Async/Await permite a los desarrolladores elegir la herramienta adecuada para su caso de uso específico. Si bien las devoluciones de llamada son la forma más sencilla de manejar operaciones asincrónicas, pueden generar código desordenado. Las promesas ofrecen un enfoque más estructurado, pero Async/Await proporciona la solución más elegante y legible. Si siguen las mejores prácticas y comprenden estas herramientas, los desarrolladores pueden escribir código asincrónico limpio, fácil de mantener y eficiente.

Declaración de liberación Este artículo se reproduce en: https://dev.to/itsshaikhaj/asynchronous-programming-in-javascript-callbacks-vs-promises-vs-asyncawait-690?1 Si hay alguna infracción, comuníquese con [email protected] para borrarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3