5. Programación Funcional y Asíncrona en JS¶
En este tema profundizaremos sobre los aspectos de programación funcional y asíncrona en JS. Aprenderás a:
Entender qué es la programación funcional
Usar programación funcional en tu software
Comenzar a usar promesas y el API Fetch
Está organizado en 8 talleres de unas 3 sesiones de clase. En total unas 24 sesiones de clase más tu trabajo en casa.
La dedicación depende del conocimiento previo, motivación y capacidad de aprendizaje del estudiante para esa sesión en concreto.
5.1. Introducción a la programación Funcional¶
Introducción a la programación funcional (hasta minuto 15)
Hay dos grandes paradigmas (formas de resolver un problema) en programación:
Imperativo: dices cómo vas a resolver el problema
Declarativo: declaras el problema (no tanto cómo vas a hacerlo)
Con este enfoque, surgen los diferentes estilos de programación (también llamados paradigmas ).
Programación Estructurada: dices, paso a paso, qué hay que hacer (instrucciones + sentencias de control + sentencias de repetición)
Programación Orientada a objetos): defines objetos, que contienen características y funcionalidad propia, y que se relacionan con otros objetos
Programación Funcional (declarativa): declaras funciones, con algunos criterios generales, para resolver tu problema
Características de la programación funcional:
Funciones como elementos de primera clase
Inmutables: para la misma entrada siempre devuelve la misma salida. No se modifican los datos de entrada.
Deben ser puras, sin efectos colaterales: no cambias el estado dentro de la función
Funciones de orden superior: pueden recibir funciones como argumentos de entrada y devolver funciones como argumentos de salida
En JS una función es un elemento de primera clase , es decir
Puedes asignar una función a una variable (y utilizarla). Ojo a los paréntesis (sólo cuando se ejecuta)
Puedes usar funciones como argumentos (porque son elementos de primera clase, es decir, valores)
Puedo usar una función como argumento en otra función (función callback), porque es un valor
Puedo devolver una función como resultado de una función, porque es un valor
Al devolver una función puedo definirla dentro de la función «anfitriona» o mejor definirla antes (hasta que tengas cierta experiencia)
Actividad T05-A01. Introducción a la programación funcional
Define la función suma(n,m), que me devuelva la suma de esos dos números.
Defínela como función anónima y la asignas a la variable f1 y a la variable f2. ¿Qué valor da f1(3,4)? ¿Y f2(8,7)?
Crea una función calculadora(operación) donde, según el caracter en el argumento operación, te devuelva una función que realice esa operación (suma +, resta -, multiplicación x y división /). Es decir, hacer una calculadora donde especificas la operación con un caracter.
5.2. Funciones Flecha (arrow functions)¶
Son una alternativa (compacta) para definir una función -> js_arrow_function
Sólo para un uso sencillo (tienen limitaciones)
Pueden tener un argumento, o varios
Son muy útiles para compactar y definir funciones, ya sea directamente o que se pasan como argumentos
Uso:
Usan el símbolo de flecha o =>
Se elimina la palabra function y return
Pasas de la definición completa a la compacta (arrow function):
Eliminas la palabra function
Eliminas las llaves {} donde defines el cuerpo de la función
Eliminas la palabra return
Eliminas los paréntesis (ojo que sólo si tienes un argumento)
Son funciones anónimas (no tienen nombre), salvo que hagas una asignación. Por ejemplo
const mi-funcion = (a,b) => a + b *6;
Actividad T05-A02. Uso de funciones flecha
Usa funciones flecha en el ejemplo de la calculadora de la sesión anterior
5.3. Callbacks (funciones llamadas dentro de funciones)¶
Es un concepto genérico( Callback-Retrollamada )
Llamamos a una función A, que ejecuta a otra función B que le pasamos como parámetro de entrada
Puede ser llamada de forma síncrona o asíncrona
La mayoría de lenguajes lo soportan, cada uno de maneras diferentes.
Usamos las funciones como elementos de primer orden (objetos)
Ya lo usamos al añadir manejadores de eventos a elementos del DOM (si usas addEventListener)
Algunos objetos tienen métodos que permiten usar funciones como argumentos (callback). Por ejemplo:
Window/setTimeout. Para ejecutar una función al finalizar un temporizador
Window/setInterval. Para ejecutar una función de forma continua
EventTarget/addEventListener. Para ejecutar una función después de la ocurrencia de un evento
Actividad T05-A03. Ejercicios con funciones callback
¿Cómo modificarías el ejemplo de la calculadora usando funciones callback?
Realiza el ejemplo del video usando Window/setTimeout
Ejecuta una función una detrás de otra
Ejecuta las funciones en formas diferentes
Realiza un pequeño juego ( por ejemplo ):
Tengo un juego con varios personajes
que se pueden atacar con diferentes armas
Atacar es la función principal (o método de un objeto personaje)
y usan diferentes armas (que en realidad son funciones)
Y podrías añadir diferentes armas (y formas de atacar) sin modificar (mucho) la estructura principal.
5.4. Funciones Map, Reduce, Filter¶
Tres muy habituales en programación funcional:
Map . Crea un array nuevo, donde cada elemento nuevo es el resultado de una función sobre el elemento antiguo
Filter . Crea un array nuevo con los elementos que cumplan una condición
Reduce .
Opción más compleja para generar un valor resultado de ejecutar una función sobre los elementos de un array
Más complejo de entender pero puede ser útil en algunos escenarios complejos
Y puede trabajar sobre objetos JS
Las llaves se encierran en paréntesis cuando se usan objetos
Eso permite usarlo a medida para procesar datos de un objeto
Actividad T05-A04. Ejercicios con funciones map, reduce y filter
Supongamos que tenemos el array a = [2,5,7, 9, 11,20, 50]. Resuelve los siguientes problemas:
Devuelve un array con los mismos elementos de a pero multiplicados por 2
Devuelve un array con los mismos elementos de a pero aplicandole la función f1. La función f1 le suma 4 al argumento de entrada
Devuelve un array con los elementos de a mayores de 10
Devuelve un array con los elementos de a que cumplan la función f2. La función f2 revisa si el argumento de entrada, multiplicado po2 en menor que 20.
Devuelve la suma de todos los números del array
Devuelve la suma de todos los números del array pero añadiendole 100. Es decir, no empieza en cero
Devuelve un valor que en realidad es el cálculo de la función f3. f3 es una función que devuelve la diferencia entre dos valores.
5.5. Asincronía en JS ( Event Loop )¶
El paradigma (por ejemplo la programación funcional) es una cosa y …
… otra la concurrencia de los procesos (o sea la programación síncrona o asíncrona)
JS: es Asíncrono y Concurrente
Síncrono/Asíncrono: En qué orden ejecuto los procesos (y si tengo que esperar a que terminen)
Concurrente/Parelelo: Quien ejecuta los procesos y en qué momento
JS: sólo se ejecuta una función a la vez (concurrente) y los gestiona de forma asíncrona
Coordinación de la ejecución asíncrona y concurrente: (Event Loop)
Ejecutar procesos
Atender eventos (capturar y procesar)
Ejecutar procesos que están esperando (en cola)
Elementos:
Stack. Una pila de tareas/procesos, a medida que se van ejecutando se va llenando
Heap. Un montón de objetos que están en memoria disponibles para ejecutar
Queue. Entra un mensaje (llamada a función) y se ejecuta hasta finalizar (run-until-completion)
Inconvenientes:
Una función podría bloquear la ejecución (y se bloquea la interacción con el usuario)
Para tareas con mucha demanda de ejecución (cálculos por ejemplo), este modelo no funciona bien
Simula la sincronía, es decir, no se puede garantizar que una función se ejecuta en el momento exacto que quieres
Actividad T05-A05. Entender los conceptos del Event Loop
Juega con la herramienta Loupe . Tiene un código predeterminado pero puedes por ejemplo crear uno:
Un botón en HTML con …
un evento «click» que lance una función después de un retardo (setTimeout)
un evento «keydown» que lance una función cuando pulses una tecla
y … lo que se te ocurra.
Y viendo la simulación puedes tratar de responder las siguientes preguntas:
En qué orden se ejecutan las funciones
¿Hay algúna función que se ejecute de forma asíncrona?
¿Qué pasa si hago click en el botón?
¿Y si hago click 3 veces?
¿Qué paso si pulso una tecla?
¿Y si la pulso varias veces?
¿Por qué elementos del event loop pasan las funciones que se ejecutan?
5.6. Promesas¶
El problema de demasiadas llamadas dentro de llamadas (callback nesting):
-
Resuelven el problema del anidamiento (nesting)
Recuperan el control de la ejecución
Es un objeto (Global_Objects/Promise) que devuelve un objeto Promise
con un resultado cuando esté listo (promete hacerlo), mientras pasa por unos estados (pending / fullfilled / rejected) y
tiene una serie de métodos para acceder al resultado (o al error)
Actividad T05-A06. Ejercicios con promesas
Crear un programa que simule un juego en el que se lanzan dos dados. Ganará el número más pequeño.
5.7. Agrupar Promesas¶
Puedo agrupar promesas e invocar varias a la vez (que no dependan unas de otras)
Evolución en JS de la programación asíncrona (en realidad es lo mismo, pero mejor presentado):
Actividad T05-A07. Crear un juego sencillo de dados
Crea un programa que simule un juego entre dos jugadores, en el que lanzan 3 dados cada uno. Gana el que sume el menor valor entre los tres.
5.8. AJAX moderno: El API Fetch¶
El API Fetch
El uso es sencillo, y a la vez permite mucha flexibilidad :
Defines el url (y si quieres el objeto Request con personalizacion de la petición)
Llamas a la función fetch del objeto window y te devolverá una promesa (de conexión)
Diseñas el encadenamiento de peticiones (y control de errores si necesitas)
Política CORS (Cross Origin Resource Sharing)
Se define quien puede acceder a recursos cruzados entre dominios
Se podría modificar la cabecera Access Headers/Access-Control-Allow-Origin
De forma predeterminada, para solicitudes asíncronas sólo podrías hacerlo al mismo dominio (cliente y servidor)
Actividad T05-A08. Refactorizar Ejercicio AJAX
Refactoriza el ejercicio final de AJAX, usando el Fetch API.
¿Podrías hacer una aplicación web que revise el calendario del mundial de Qatar ? Lo que me gustaría es:
Seleccionar un equipo y que me diga qué día y a qué hora juega
Seleccionar un partido y que me diga el resultado
Seleccionar un día y que me diga qué partidos hay