CursosEmpresasBlogLiveConfPrecios

Generators

Clase 19 de 26 • Curso de Asincronismo con JavaScript

Clase anteriorSiguiente clase

Contenido del curso

Introducción
  • 1
    Lo que aprenderás en este curso

    Lo que aprenderás en este curso

    01:34
  • 2
    Qué es el asincronismo

    Qué es el asincronismo

    09:25
  • 3
    Event Loop

    Event Loop

    11:13
  • 4
    Iniciando a programar con JavaScript

    Iniciando a programar con JavaScript

    02:59
Callbacks
  • 5
    Configuración

    Configuración

    10:23
  • 6
    Qué son los Callbacks

    Qué son los Callbacks

    14:56
  • 7

    Playground: Ejecuta un callback con 2s de demora

    00:00
  • 8
    XMLHTTPRequest

    XMLHTTPRequest

    15:03
  • 9
    Fetch data

    Fetch data

    17:44
  • 10
    Callback hell

    Callback hell

    06:56
Promesas
  • 11
    Qué son las promesas

    Qué son las promesas

    11:54
  • 12

    Playground: Crea una función de delay que soporte asincronismo

    00:00
  • 13
    Fetch

    Fetch

    16:12
  • 14
    Fetch POST

    Fetch POST

    14:55
Async Await
  • 15
    Funciones asíncronas

    Funciones asíncronas

    10:07
  • 16
    Try and catch

    Try and catch

    11:51
  • 17

    Playground: Captura el error de una petición

    00:00
  • 18
    ¿Cómo enfrentar los errores?

    ¿Cómo enfrentar los errores?

    03:42
Generadores
  • 19
    Generators

    Generators

    08:06
Proyecto CV
  • 20
    Proyecto del curso

    Proyecto del curso

    11:48
  • 21
    Consumiendo API

    Consumiendo API

    19:24
  • 22
    Desplegando el proyecto

    Desplegando el proyecto

    16:45
  • 23

    Playground: Crea una utilidad para hacer peticiones

    00:00
Nunca pares de crear
  • 24
    Conclusión

    Conclusión

    03:09
  • 25
    ¿Qué camino tomar para seguir aprendiendo?

    ¿Qué camino tomar para seguir aprendiendo?

    04:12
  • 26

    Autoevaluación de Proyecto: Creación de Landing Page

    00:44
    Maria Gabriela Rodriguez Cuevas

    Maria Gabriela Rodriguez Cuevas

    student•
    hace 3 años

    💡 𝗖𝗹𝗮𝘀𝗲 #𝟭𝟲: 𝗚𝗲𝗻𝗲𝗿𝗮𝘁𝗼𝗿𝘀 𝟭𝟲/𝟮𝟭 💡 . Un ++generador++ en JavaScript consta de una función generadora que muestra un objeto iterable Generator. La palabra reservada yield se usa para pausar y reanudar una función generadora. Fuente: aquí .

    • La estructura del Generador consta con la palabra function seguido de un asterísco * : function* ésta es una función generadora heredada.
    • El resultado que se quiere obtener se coloca al lado derecho de yield, puede ser de cualquier tipo (string, numérico, objetos, etc) y se puede tener tantos yield que se desee.
    //Declaración de la función del Generador function* gen(){ yield 1; yield 2; yield 3; }

    Para poder iterar con el generador, se puede inicializar un valor con la función generadora:

    //Expresión de la función Generadora const g = gen();

    Entre las propiedades del iterador está next():

    //Llamada del método next en el objeto del Generador console.log(g.next()); //Imprime el primer yield: {value: 1, done: false}

    next() permite acceder a la función del generador y obtener con yield dos valores: ++value++ y el estado de ++done++, es decir si tenemos yield 1; y mandamos a imprimir el resultado con next() obtenemos `{value: 1, done: false}':

    • El 1 por el valor al lado derecho del primer yield.
    • Y done es false porque mientras haya otro yield por operar será falso.
    • Será true cuando se ejecute cuatro veces next() y la salida mostrará {value: undefined, done: true}. Ésto se debe a que ya no hay mas nada que mostrar, porque se mandó a imprimir un cuarto elemento y el generador solo tiene 3 yield. .

    Para obtener solo el valor de value, se escribe next().value de ésta forma:

    //Llamada del método next en el objeto del Generador console.log(g.next().value); //Imprime el primer yield: 1 console.log(g.next().value); //Imprime el segundo yield: 2 console.log(g.next().value); console.log(g.next().value); //Si se coloca un cuarto console, la consola indica "Undefined"

    . ✏️ ++Ejemplo usando for … of:++

    //Declaración de la función del Generador pasando un argumento function* iterate(array){ for(let value of array){ //El loop del for revisa cada elemento del array yield value; //value es asignado en cada ciclo } } const it = iterate(['Oscar', 'Omar', 'Ana', 'Lucia', 'Juan']); //la diferencia con el ejemplo anterior es que el iterador se le pasa un argumento console.log(it.next().value); //Imprime el primer elemento del array: Oscar console.log(it.next().value); //Imprime el segundo elemento del array: Omar console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); //Si se coloca un sexto console, la consola indica "Undefined"
      Maria Gabriela Rodriguez Cuevas

      Maria Gabriela Rodriguez Cuevas

      student•
      hace 3 años

      ⚒️ Mi solución al reto usando la función fetchData() como un Generator:

      //Platzi-Async //Author: @marigabirodcue //Date: 01/07/2022 import fetch from 'node-fetch'; const API = 'https://api.escuelajs.co/api/v1'; const urlApi = API; //Declaración de fetchData como la función del Generador async function* fetchData(url) { const response = await fetch(url); yield await response.json(); } //Llamadas con el método next() en el objeto del Generador usando .then() y manipulando value y done fetchData(`${urlApi}/products`).next().then(({ value, done }) => { console.log(value); //Imprime la lista de los Productos de la API const idProduct =value[0].id; //Extrae el id del producto que queremos manipular console.log(`Copiame: ${urlApi}/products/${idProduct} y pegame en el navegador`); fetchData(`${urlApi}/products/${idProduct}`).next().then(({ value, done }) => { console.log(value.title); //Imprime el Título del producto solicitado const idCategory = value.category.id; fetchData(`${urlApi}/categories/${idCategory}`).next().then(({ value, done }) => { console.log(value.name); //Imprime el nombre de la categoría del producto seleccionado }); }); });
      Andres Gordon

      Andres Gordon

      student•
      hace 3 años

      ¿Cómo puedo hacer el resaltado en negrita en los aportes? Muchas gracias de antemano.

    LUZ ADRIANA MARTINEZ RAMIREZ

    LUZ ADRIANA MARTINEZ RAMIREZ

    student•
    hace 3 años

    Mi solucion al reto:

    020722.png

      Steven Javier Arevalo Poveda

      Steven Javier Arevalo Poveda

      student•
      hace 3 años

      Qué tema usas en el editor de código?

      Juan David Reyes

      Juan David Reyes

      student•
      hace 3 años

      Caballa

    Pablo Gabriel Mederos Caballero

    Pablo Gabriel Mederos Caballero

    student•
    hace 3 años

    Sería bueno que en lugar de tirar conceptos solamente, se explique qué uso se le daría en la vida real. No todos los que llegan a este curso tienen la experiencia suficiente, como par abstraer por sí mismos, en qué aplicar esta funcionalidad. Queda además pendiente explicar que esto genera un iterador, sus ventajas, y qué significa el done: false, del objeto que devuelve el iterator.next().

      Marcelo Jorge Bellizia

      Marcelo Jorge Bellizia

      student•
      hace 2 años

      es lo mas importante, para que no sea tan abstracto

      Santiago Perozo

      Santiago Perozo

      student•
      hace un año

      El done: false, significa que todavía hay mas yield por ejecutar, es decir que no ha llegado al final de la secuencia. En cambio, cuando es true quiere decir que ya no hay mas nada que ejecutar porque el iterador llego al final de la secuencia.

    David Alejandro Cuastumal Bucheli

    David Alejandro Cuastumal Bucheli

    student•
    hace 3 años

    Un pequeño aporte de el reto

    import fetch from "node-fetch"; const API = 'https://api.escuelajs.co/api/v1'; /*creamos la funcion de fetchData la cual utiliza la APi y retornamos la informacion en un tipo objeto JSON, implementando la logica de async y await, en este ejemplo usamos una funcion tradicional*/ const fetchData = async (urlApi) => { const response = await fetch(urlApi); const data = await response.json(); return data; } /*creamos la funcion que realiza las solicitudes en este caso usaremos tambien yield y el "*"" al lado de function para identificar un generator Tambien usamos async y await para hacer el llamado de los productos y demas */ async function* anotherFunction (urlApi) { const products = await fetchData(`${urlApi}/products`); const product = await fetchData(`${urlApi}/products/${products[0].id}`); const category = await fetchData(`${urlApi}/categories/${product.category.id}`); //Se utiliza yield para dar una pausa a la ejecucion y utilizamos .next() para dar inicio a el codigo yield console.log(products); yield console.log(product.title); yield console.log(category.name); } const g = anotherFunction(API); g.next().value; g.next().value; g.next().value;
      Woldev S.A.S

      Woldev S.A.S

      student•
      hace 3 años

      Creo que aquí no es necesario añadir la propiedad .value ya que no estás llamando con yield un valor sino una expresión. Lo digo ya que corrí este código sin el value y muestra exactamente lo mismo... ¿Alguien que pueda brindar una explicación más precisa de por qué añadir .value en este caso no cambia nada?

      Yerson David Aguilar Martinez

      Yerson David Aguilar Martinez

      student•
      hace 3 años

      @Woldev tal cual como lo dijiste, El g.next() devuelve una promesa, concretamente nos regresa lo que esta a la derecha de la palabra yield en este caso solo hay un console.log(), eso no es un valor, es una ejecución de código, entonces nuestro g.next() tiene el valor:

      Promise { { value: undefined, done: false } }

      Cuando accedes a .next().value estas accediendo a undefined, podrías poner cualquier propiedad que quieras, por ejemplo g.next().cangrejito e igual tendrás el mismo resultado (undefined), eso si, no trates de acceder mas allá, por ejemplo: g.next().cangrejito.patita porque .cangrejito al igual que .value tienen el valor undefined y no puedes acceder a una propiedad de algo que no esta definido.

      En fin, como no estas haciendo nada con tus llamadas a g.next(), o sea no las estas guardando para despues ni nada, solo esta activando el console.log() da igual lo que pongas, mientras llames al g.next() todo funcionará igual.

    Carlos Andrés Norato Gómez

    Carlos Andrés Norato Gómez

    student•
    hace 3 años

    Reto resuelto💚

    import fetch from "node-fetch"; const API = 'https://api.escuelajs.co/api/v1'; function getData(urlAPI){ return fetch(urlAPI) } async function anotherFunction(urlAPI){ const response = await getData(urlAPI) const data = await response.json() return data; } async function* iterateGet(){ const products = await anotherFunction(`${API}/products`); const product = await anotherFunction(`${API}/products/${products[0]?.id}`); const category = await anotherFunction(`${API}/categories/${product?.category?.id}`); yield console.log(products); yield console.log(product.title); yield console.log(category.name); } const g = iterateGet() g.next().value; g.next().value; g.next().value;
      Paul Martin Vargas Portugal

      Paul Martin Vargas Portugal

      student•
      hace 3 años

      Yo lo intenté, pero no cambié el apiUrl pero al cambiarlo como tu a ${API} si me funcionó, porque llegaste a cambiar o mejor dicho, porque funciona ese cambio. Toy chiquito

      Fabian Bejarano González

      Fabian Bejarano González

      student•
      hace 3 años

      Te sobra una función, podrías resumirla en la segunda, pero usando fetch directamente:

      const fetchData = async (urlApi) => { const response = await fetch(urlApi); const data = await response.json(); return data; }

      Y tambien la idea es que las funciones tengan parametros para que sean reutilizables. Digamos que tienes dos APIS, const API y const API2. En tu ejemplo tu función si o si usa API y no sería posible usar API2. Sería más reutilizable de la siguiente manera:

      async function* gettingData (urlApi) { const products = await fetchData(`${urlApi}/products`); const product = await fetchData(`${urlApi}/products/${products[0].id}`); const category = await fetchData(`${urlApi}/categories/${product.category.id}`); yield console.log(products.length); yield console.log(product.title); yield console.log(category.name); }

      Yo sufrí mucho con el yield, pero tu solución me dio lo que me faltaba.

    Max Andy Diaz Neyra

    Max Andy Diaz Neyra

    student•
    hace 3 años

    Aqui les dejo informacion sobre las funciones generadores del MDN:

    • Los generadores son funciones de las que se puede salir y volver a entrar. Su contexto (asociación de variables) será conservado entre las reentradas.
    • La llamada a una función generadora no ejecuta su cuerpo inmediatamente; se devuelve un objeto iterador para la función en su lugar.
    • Cuando el metodo next() del iterador es llamado , el cuerpo de la función generadora es ejecutado hasta la primera expresión yield, la cual especifica el valor que será retornado por el iterador o con, yield*, delega a otra función generadora.
    • El método next() retorna un objeto con una propiedad value que contiene el valor bajo el operador yield y una propiedad done que indica, con un booleano, si la función generadora ha hecho yield al último valor.
    Angel David Contreras Barrios

    Angel David Contreras Barrios

    student•
    hace 3 años

    Reto:

    import fetch from "node-fetch"; const API = 'https://api.escuelajs.co/api/v1'; async function fetchData(urlApi){ const response = await fetch(urlApi); const data = await response.json(); return data; } async function* iterData (urlApi){ try{ const products = await fetchData(`${urlApi}/products`); yield console.log(products[12]); const product = await fetchData(`${urlApi}/products/${products[0].id}`); yield console.log(products[20]); const category = await fetchData(`${urlApi}/categories/${product.category.id}`); yield console.log(products[30]); console.log('Finalizo'); } catch (error) { console.log(error); } } const res = iterData(API); res.next(); res.next(); res.next(); res.next();
      Andrés Felipe Eslava Zuluaga

      Andrés Felipe Eslava Zuluaga

      student•
      hace 3 años

      Gracias a tu ejemplo entendí!

      Julian Ward

      Julian Ward

      student•
      hace 3 años

      Tu codigo esta bien y funciona, pero en este caso no era necesario las constantes product y category, ya que no haces uso de ellas y solo usas products

    Fritza Véliz

    Fritza Véliz

    student•
    hace 3 años

    Aquí dejo el desarrollo que realicé para el desafío :) ![](

    Captura de Pantalla 2023-03-03 a la(s) 22.02.58.png

    Jovanny Alarcon C

    Jovanny Alarcon C

    student•
    hace 3 años

    por que es que se usa el * (function*) ???

      Jovanny Alarcon C

      Jovanny Alarcon C

      student•
      hace 3 años

      function* La declaración function* (la palabra clave function seguida de un asterisco) define una función generadora, que devuelve un objeto Generator.

      También puedes definir funciones generadoras usando el constructor GeneratorFunction y una function* expression.

    Andre Huaman Yovera

    Andre Huaman Yovera

    student•
    hace 2 años

    Permíteme explicarte sobre los generadores en JavaScript y darte un ejemplo práctico. . En JavaScript, un generador es una función especial que puede pausar su ejecución y luego reanudarla en un punto específico. A diferencia de una función regular, que se ejecuta de principio a fin y devuelve un valor final, un generador puede producir una secuencia de valores a medida que se va ejecutando. Estos valores se generan uno por uno, bajo demanda, lo que hace que los generadores sean útiles para trabajar con colecciones de datos grandes o para generar secuencias infinitas. . Los generadores en JavaScript se definen utilizando la sintaxis de función de generador, que se ve así:

    function* miGenerador() { // Código del generador yield valor; // Más código del generador }

    La palabra clave function* indica que estás creando una función generadora. Dentro del generador, puedes utilizar la palabra clave yield para pausar la ejecución y devolver un valor. El generador se reanuda cada vez que se llama a next() en el objeto generado, y la ejecución continúa desde el punto donde se hizo la pausa. . Aquí tienes un ejemplo práctico para comprenderlo mejor. Supongamos que deseas generar una secuencia de números pares utilizando un generador:

    function* generadorNumerosPares() { let num = 0; while (true) { yield num; num += 2; } } const miGenerador = generadorNumerosPares(); console.log(miGenerador.next().value); // Salida: 0 console.log(miGenerador.next().value); // Salida: 2 console.log(miGenerador.next().value); // Salida: 4 console.log(miGenerador.next().value); // Salida: 6

    En este ejemplo, creamos un generador llamado generadorNumerosPares(). Utilizamos un bucle while (true) para generar infinitos números pares. En cada iteración, pausamos la ejecución con yield y devolvemos el número actual. Luego, incrementamos el número en 2 para la siguiente iteración. . Al llamar a next() en el objeto generado miGenerador, obtenemos el siguiente valor de la secuencia. Cada llamada a next() reanuda la ejecución del generador desde el punto donde se hizo la pausa, generando así una secuencia infinita de números pares. . Espero que este ejemplo te haya ayudado a comprender mejor los generadores en JavaScript. Si tienes más preguntas, no dudes en hacerlas.

    Max Andy Diaz Neyra

    Max Andy Diaz Neyra

    student•
    hace 3 años

    Mi solucion seria la siguiente:

    • En los navegadores modernos, await de nivel superior funciona, siempre que estamos dentro de un módulo.
    • Tam
    import fetch from "node-fetch"; const API = 'https://api.escuelajs.co/api/v1'; async function fetchData (urlApi){ const res = await fetch(urlApi); const data = await res.json(); return data; } async function* anotherFn(urlApi){ try { const products = await fetchData(`${urlApi}/products`); yield products[0]; const product = await fetchData(`${urlApi}/products/${products[0].id}`); yield product.title; const category = await fetchData(`${urlApi}/categories/${product?.category?.id}`); yield category.name } catch (err) { console.error(err); } } let promiseGenerator = anotherFn(API) console.log((await promiseGenerator.next()).value) console.log((await promiseGenerator.next()).value) console.log((await promiseGenerator.next()).value)

    Otra forma mas soportanda por navegadoes antiguos

    import fetch from "node-fetch"; const API = 'https://api.escuelajs.co/api/v1'; async function fetchData (urlApi){ const res = await fetch(urlApi); const data = await res.json(); return data; } async function* anotherFn(urlApi){ try { const products = await fetchData(`${urlApi}/products`); yield products[0]; const product = await fetchData(`${urlApi}/products/${products[0].id}`); yield product.title; const category = await fetchData(`${urlApi}/categories/${product?.category?.id}`); yield category.name } catch (err) { console.error(err); } } async function aux(urlApi){ let promiseGenerator = anotherFn(urlApi) console.log((await promiseGenerator.next()).value) console.log((await promiseGenerator.next()).value) console.log((await promiseGenerator.next()).value) } aux(API)
    diego gomez

    diego gomez

    student•
    hace 3 años

    Estuve intentando hacer el ejemplo con forEach para hacer el recorrido del array y me dio error, no sé si lo hice mal o la sintaxis del generator debe ser exactamente con el ciclo forOf

      Agustín De La Vega

      Agustín De La Vega

      student•
      hace 3 años

      Yo también lo hice y tampoco me funciono, a lo mejor no se puede usar con forEach. Aquí hay un foro donde discutieron este tema: foro

    thiago carrea

    thiago carrea

    student•
    hace 3 años

    ¿Como hago para que se recorran todos los yields automaticamente? es decir sin tener que escribir toda la cantidad de yields que existen

    console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); console.log(it.next().value);

    asi quedo el recorrido de mi array, imaginense en un proyecto jajaja

      Kevin J. Zea Alvarado

      Kevin J. Zea Alvarado

      student•
      hace 3 años

      Hola, Thiago. 👋

      De manera simple, se podría usar un foor loop o while para recorrer todos los yield de la función generadora. Sin embargo, no suele ser ése el uso práctico de los generators.

      Te dejo aquí un video donde se explica cómo funcionan y algunos de sus usos prácticos.

    Ulqernesh Karvenae

    Ulqernesh Karvenae

    student•
    hace 2 años

    📣 Utilizando Generadores en JavaScript

    . En la programación con JavaScript, los generadores pueden marcar una gran diferencia al manejar operaciones costosas o trabajar con grandes cantidades de datos. .

    • 🚀 Producir y procesar 'bajo demanda': En lugar de generar todos los datos de una vez (lo que puede agotar memoria y recursos), los generadores nos permiten producir y procesar datos 'bajo demanda'. Esto significa que cada dato se genera justo cuando lo necesitamos, optimizando el uso de memoria y distribuyendo la carga de trabajo a lo largo del tiempo. . Esto es particularmente útil para:
      • Manejo de grandes conjuntos de datos
      • Creación de flujos de datos infinitos
      • Gestión eficiente de paginación de datos .
    • ⏱ Optimización de operaciones asíncronas costosas: Imagina que tienes un array de 30 elementos, y cada uno tarda 2 segundos en cargarse. Si utilizas un bucle for o forEach, tendrías que esperar un minuto completo para procesar todos los elementos. Pero con un generador, puedes comenzar a trabajar con cada elemento tan pronto como esté disponible, es decir, cada 2 segundos, sin tener que esperar a que todos estén listos. . Esto optimiza tu código y mejora la experiencia del usuario al brindar respuesta inmediata con cada elemento cargado, en lugar de hacerlo esperar hasta que todo esté listo. 💡 . Recuerda: los generadores son solo una de las herramientas en tu caja de herramientas de JavaScript. ¡Úsalos donde sea apropiado para hacer tu código más eficiente y fácil de entender! .
    Luis Alfredo Suarez

    Luis Alfredo Suarez

    student•
    hace 2 años

    19/26 Curso de Asincronismo: Generators

    Los generadores en JavaScript son una característica que permite crear funciones especiales que pueden pausar su ejecución y luego reanudarla más tarde. Esto es útil para trabajar con secuencias de datos potencialmente largas, como bucles infinitos o grandes conjuntos de datos, sin bloquear la ejecución del programa. Los generadores se crean utilizando la palabra clave function seguida de un asterisco *, y se utilizan para producir valores de manera incremental a medida que se solicitan.
    Aquí tienes un ejemplo simple de cómo se define y utiliza un generador en JavaScript:

    function* generadorSimple() { yield 1; yield 2; yield 3; } // Crear una instancia del generador const generador = generadorSimple(); // Llamar al generador para obtener valores uno a uno console.log(generador.next().value); // Imprime 1 console.log(generador.next().value); // Imprime 2 console.log(generador.next().value); // Imprime 3 console.log(generador.next().value); // Imprime undefined (se han agotado todos los valores)


    En el ejemplo anterior, la función generadorSimple es un generador que produce los números del 1 al 3 utilizando la palabra clave yield. La función next() se utiliza para obtener el siguiente valor producido por el generador. Cuando el generador se agota, next() devuelve un objeto con la propiedad value igual a undefined.
    Los generadores son especialmente útiles en situaciones donde se necesita procesar grandes cantidades de datos de forma eficiente o cuando se deben realizar operaciones de forma asíncrona, como en el caso de las promesas y la programación asincrónica.
    Puedes usar generadores para crear iteradores personalizados y para simplificar el código en ciertos casos, especialmente cuando se trabaja con flujos de datos complejos.

    Imgur

    Espero sea de utilidad. 👨‍💻

    Luis Hernando Sendoya Serrato

    Luis Hernando Sendoya Serrato

    student•
    hace 3 años

    De una forma breve, obtuve la data de categorías. Por supuesto se podría agregar nuevas peticiones.

    import axios from "axios"; const URL = ' https://api.escuelajs.co/api/v1/categories'; async function* getData() { const data = await axios.get(URL); yield console.log(data); } const g = getData(); console.log(g.next().value)
    Alejandro Sebastian Dubon Estrada

    Alejandro Sebastian Dubon Estrada

    student•
    hace 3 años
    const BASE_URL = 'https://api.escuelajs.co/api/v1'; const fetchData = async (urlApi) => { try { const response = await fetch(urlApi); return await response.json(); } catch (error) { console.error(error); } }; function* arrayGenerator(array = []) { for (const value of array) { yield value; } } function* requester() { yield fetchData(`${BASE_URL}/products?offset=0&limit=5`); yield fetchData(`${BASE_URL}/products/1`); yield fetchData(`${BASE_URL}/categories/2`); } // ------------------------------------------------------------ async function main() { // case 1 - iterate over an array of products const products = await fetchData(`${BASE_URL}/products?offset=0&limit=5`); const product = await fetchData(`${BASE_URL}/products/${products[0].id}`); const category = await fetchData(`${BASE_URL}/categories/${product.category.id}`); const productsIterator = arrayGenerator(products); console.log(productsIterator.next().value); console.log(productsIterator.next().value); // case 2 - iterate over an array of promises const requestsIterator = arrayGenerator(await Promise.all([ fetchData(`${BASE_URL}/products/17`), fetchData(`${BASE_URL}/products/30`), fetchData(`${BASE_URL}/products/51`), ])); console.log(requestsIterator.next().value); console.log(requestsIterator.next().value); console.log(requestsIterator.next().value); // case 3 - generator of requests const requesterIterator = requester(); console.log(await requesterIterator.next().value); console.log(await requesterIterator.next().value); console.log(await requesterIterator.next().value); } main();
    Angel Daniel Almanza Trejo

    Angel Daniel Almanza Trejo

    student•
    hace 3 años

    Mi solución al reto

    import fetch from "node-fetch"; const API = 'https://api.escuelajs.co/api/v1'; const fetchData = async (urlApi) => { const response = await fetch(urlApi); const data = await response.json(); return data; } async function* anotherFunction() { const products = await fetchData(`${API}/products`) yield products; const product = await fetchData(`${API}/products/${products[0].id}`); yield product; const category = await fetchData(`${API}/categories/${product.category.id}`); yield category; } const info = anotherFunction(); info.next().then((response) => console.log(response.value)).catch((error) => console.error(error)); info.next().then((response) => console.log(response.value.title)).catch((error) => console.error(error)); info.next().then((response) => console.log(response.value.name)).catch((error) => console.error(error));
    Usuario anónimo

    Usuario anónimo

    user•
    hace 3 años
    function* gen() { yield 1; yield 2; yield 3; } const g = gen(); console.log(g.next().value); console.log(g.next().value); console.log(g.next().value); //con la propiedad .netx se van recorriendo los yield por lo que en cada ocasión nos da un valor diferente function* iterate(array){ for (let value of array) { yield value } } const it = iterate(['oscar', 'dante', 'ana', 'lucia', 'juan']) console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); console.log(it.next().value); //como no hay siguiente valor arroja undefined
    Raycris Maldonado

    Raycris Maldonado

    student•
    hace 3 años

    Me quedo con la duda de como esto de generators me puede servir ya en el ambito loboral, no encuentro un ejemplo practico para entenderlo. Alguien sabe un ejemplo en del campo laboral?

      Alan Cabrera

      Alan Cabrera

      student•
      hace 3 años

      Aquí hay un comentario de un compañero que te puede ayudar. Saludos! :)

      Raycris Maldonado

      Raycris Maldonado

      student•
      hace 3 años

      Gracias Alan. saludos!

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads