Ir al contenido principal

Destacado

C4 Model | Por una mejor comunicación

Introducción. Han pasado muchos años desde la introducción de UML en el ámbito del desarrollo de software, con la llegada de Agile , la forma de desarrollar software cambió drásticamente: algunos conceptos evolucionaron, aparecieron nuevos mientras que otros fueron abandonados. Hoy en día, UML es utilizado por contadas personas,  la propia industria ha dejado de lado aquellos elaborados diagramas,  recurriendo a diagramas genéricos o diagramas parciales, altamente variados entre sí, para representar y describir arquitecturas/diseños. Aquí es donde entra Simon Brown , quien identificó este problema de comunicación dentro de las organizaciones. Para solucionarlo, desarrolló el modelo C4 , un sistema de modelos, capaz de describir el software de manera clara y accesible, no solo para  los equipos de desarrollo y arquitectos sino para todo aquel interesado en comprender el funcionamiento y  estructura de un sistema . Modelo C4. El modelo C4 se basa en un c...

Código en 5 minutos | Promesas(Promises) sequenciales

Intro

Esta es un pequeña técnica que aprendí mientras trabaja con Promises y es que todos conocemos Promise.all que nos permite reaccionar respecto a un conjunto de Promises cuyo orden ejecución es arbitrario.

Pero ¿Qué pasa cuando tenemos un conjunto de Promises y queremos reaccionar al termino de cada una ellas pero necesitamos que se ejecuten en un determinado orden?

Por ejemplo imagina un proceso de sincronización archivos que recorre una lista y debe actualizar ciertos estados tanto por proceso como en la finalización del mismo.


Setup

Definamos un arreglo con métodos que devolverán Promises
let tasks = [
 () => Promise.resolve("a"),
 () => Promise.resolve("b"),
 () => Promise.resolve("c")
];

Solución

Definimos nuestra función que tomará como parámetros:
  • El arreglo de tareas 
  • Un callback que se ejecutará después de cada tarea y a la cual le pasaremos la salida de la última tarea que se ejecutó.
Además debe regresar un Promise para que podamos atacharnos al final del proceso.
function allInSeq(tasks, afterEach) {
    return tasks.reduce((promiseChain, currentTask) => {
        return promiseChain
        .then(() => currentTask())
        .then((r) => {return afterEach(r)});
    }, Promise.resolve(true));
}

Para encadenar las tareas usamos el método reduce, que tiene 2 parámetros; un callback que se ejecuta por cada elemento en el arreglo y 1 valor inicial; El valor inicial es importante ya que debemos proporcionar un Promise ya resuelto.


En acción

// Callback que se ejecutará después de cada tarea
function updateUI(r) {
    console.log(r);
}
// Llamada a nuestra implementación
allInSeq(tasks, updateUI)
.then(() => { // Se ejecutará al final de todas las tareas
    console.log("End");
});


Así de sencillo, espero que les sea de utilidad como lo fue para mí.


Saludos!

Comentarios

Entradas populares