cover

Dominando Effect Generators: Una Guía para Principiantes


Escuchar este post

Selecciona una voz y genera audio para escuchar este post

Los generadores en Effect.js son una herramienta poderosa que puede transformar la manera en que escribes código asíncrono. Si vienes del mundo de async/await, te sentirás como en casa, pero con poderes adicionales. 👨🏻‍💻

¿Qué son los Effect Generators?

Effect.gen es una utilidad que te permite escribir código asíncrono usando generadores de JavaScript. La magia está en que tu código se ve y se comporta como código síncrono tradicional, pero puede manejar operaciones asíncronas, errores y flujos de control complejos de manera elegante. 🎩👒

¿Cómo Funciona?

El patrón es simple y consistente:

  1. Envuelve tu lógica en

    Effect.gen(function* () { ... })
    
  2. Usa yield* para manejar efectos (operaciones que pueden fallar o ser asíncronas) ✅

  3. Retorna el resultado final como lo harías en cualquier función

Effect.gen vs async/await

Si ya conoces async/await, entonces, la transición es natural:

Con async/await (JavaScript tradicional):

async function processTransaction() { try { const amount = await fetchTransactionAmount() const rate = await fetchDiscountRate() const discounted = await applyDiscount(amount, rate) return addServiceCharge(discounted) } catch (error) { // Manejo básico de errores console.error(error) }}

Con Effect.gen:

const processTransaction = Effect.gen(function* () { const amount = yield* fetchTransactionAmount const rate = yield* fetchDiscountRate const discounted = yield* applyDiscount(amount, rate) return addServiceCharge(discounted)}) // El manejo de errores es automático y más robusto*

¡El manejo de errores es automático! 🤯

Tu Primer Effect Generator

Veamos un ejemplo práctico. 🧐

Imagina que estás construyendo un sistema de procesamiento de transacciones:

import { Effect } from "effect" // Funciones auxiliares const addServiceCharge = (amount: number) => amount + 1 const applyDiscount = ( total: number, discountRate: number ): Effect.Effect<number, Error> => discountRate === 0 ? Effect.fail(new Error("Discount rate cannot be zero")) : Effect.succeed(total - (total * discountRate) / 100) // Operaciones asíncronas simuladas const fetchTransactionAmount = Effect.promise(() => Promise.resolve(100)) const fetchDiscountRate = Effect.promise(() => Promise.resolve(5)) // El programa principal usando Effect.gen const program = Effect.gen(function* () { // Obtener el monto de la transacción const transactionAmount = yield* fetchTransactionAmount // Obtener la tasa de descuento const discountRate = yield* fetchDiscountRate // Calcular el monto con descuento const discountedAmount = yield* applyDiscount( transactionAmount, discountRate ) // Aplicar cargo por servicio const finalAmount = addServiceCharge(discountedAmount) return `Final amount to charge: ${finalAmount}` })

Ventajas de Effect Generators

1. Manejo de Errores Superior

Los errores se propagan automáticamente y puedes manejarlos de manera granular sin bloques try/catch anidados.

2. Composabilidad (o componibilidad)

Puedes combinar efectos fácilmente y crear pipelines de procesamiento complejos. 🧪

3. Cancelación Automática

Si algo falla en el medio, toda la cadena se cancela de manera segura.

4. Tipado Fuerte

TypeScript puede inferir tipos a través de toda la cadena de efectos. 🦕

Configuración Necesaria

Para usar generadores en tu proyecto, asegúrate de tener esta configuración en tu tsconfig.json:

{ "compilerOptions": { "target": "es2015", // o superior // O alternativamente: "downlevelIteration": true }}

Cuándo Usar Effect Generators

Los generadores son ideales cuando:

  • Tienes múltiples operaciones asíncronas que dependen unas de otras
  • Necesitas manejo de errores robusto
  • Trabajas con efectos secundarios que requieren control explícito
  • Quieres código más legible y mantenible
  • O si quieres afilar tus armas para subir al siguiente nivel como developer. ⚔️

Ejecutando tu Programa

Para ejecutar un efecto, usa:

Effect.runPromise(program) .then(console.log) // Output: Final amount to charge: 96 .catch(console.error)

Los Effect Generators combinan lo mejor de ambos mundos: la simplicidad sintáctica de async/await con el poder y control de la programación funcional. 🤩

Una vez que los domines, escribir código asíncrono robusto se volverá segunda naturaleza. 🍂

¿Listo para empezar? Instala Effect en tu proyecto y comienza a experimentar con estos patrones. Tu código futuro te lo agradecerá.


¿Te gustó este artículo? Compártelo con otros desarrolladores que puedan beneficiarse de aprender sobre Effect Generators.

Abrazo. Bliss. 🤓

Enlaces relacionados

Generadores de JS

meta cover

Cómo publicar un SPA en Github Pages con React Router.

Checa este otro Post

meta cover

5 herramientas para Diseño de Interfaces en 2025

Checa este otro Post

¡Nuevo curso!

Animaciones web con React + Motion 🧙🏻