
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:
-
Envuelve tu lógica en
Effect.gen(function* () { ... })
-
Usa
yield*
para manejar efectos (operaciones que pueden fallar o ser asíncronas) ✅ -
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

Cómo publicar un SPA en Github Pages con React Router.
Checa este otro Post
