{"id":782,"date":"2024-07-30T20:59:13","date_gmt":"2024-07-30T18:59:13","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=782"},"modified":"2024-07-30T20:59:13","modified_gmt":"2024-07-30T18:59:13","slug":"006-generators","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/javascript\/javascript-practico\/09-nuevos-tipos-y-caracteristicas-en-javascript\/006-generators\/","title":{"rendered":"006. Generators"},"content":{"rendered":"\n<p>En el cap\u00edtulo anterior ve\u00edamos el concepto de los tipos de datos que son <strong>iterables<\/strong>, y de una interface que los elementos iterables tienen, denominada <strong>iterador<\/strong>.<\/p>\n\n\n\n<p>En este cap\u00edtulo vamos a ver una sintaxis m\u00e1s sencilla para generar <strong>iteradores<\/strong>, que se conoce como <strong>generators<\/strong> o <strong>generadores<\/strong>, y es una funci\u00f3n que permite trabajar de una manera m\u00e1s amigable con la interface de los iteradores en un elemento iterable.<\/p>\n\n\n\n<p>Veamos un ejm.<\/p>\n\n\n\n<p><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">function* iterable() {\n   \/\/ El asterisco le indica a Javascript que es un generador\n   yield \"Hola\";\n   console.log(\"Hola consola\");\n   yield \"hola 2\";\n   console.log(\"Mas instrucciones de c\u00f3digo\");\n   yield \"Hola 3\";\n   yield \"Hola 4\";\n}\n\nlet iterador = iterable();\nconsole.log(iterador.next());\n\/\/ Imprimir\u00e1 el primer \"Hola\" del primer yield\nconsole.log(iterador.next());\n\/\/ Imprime \"Hola consola\" y \"Hola 2\" del segundo yield\n<\/pre>\n\n\n\n<p>El <strong>asterisco<\/strong> (*) le indica a <strong>Javascript<\/strong> que es un <strong>generador<\/strong>. Utilizamos la palabra reservada <strong><em>yield<\/em><\/strong>, que es como un <strong><em>return<\/em><\/strong>, que le va a indicar a la <strong>funci\u00f3n<\/strong> que cuando detecte que la han mandado a llamar con el m\u00e9todo <strong><em>next()<\/em><\/strong> del <strong>iterador<\/strong>, aqu\u00ed mando el primer valor, y dejamos el cursor en el c\u00f3digo interno de la <strong>funci\u00f3n<\/strong>. Cuando se vuelve a ejecutar un segundo m\u00e9todo <strong><em>next()<\/em><\/strong> fuera de esta <strong>funci\u00f3n<\/strong>, ir\u00eda a buscar el siguiente <strong><em>yield<\/em><\/strong>. Si no encontramos un <strong><em>yield<\/em><\/strong>, significa que ha acabado con los valores de la <strong>funci\u00f3n iterable<\/strong>, y el m\u00e9todo <strong><em>next()<\/em><\/strong> nos dar\u00eda en su propiedad <strong><em>done<\/em><\/strong> el valor <em>true<\/em>.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Nota<\/strong>: Hasta cierto punto, los <strong>generadores<\/strong> nos permiten manejar <strong>comportamiento as\u00edncrono<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<p>Un <strong>generador<\/strong> lo que transforma es el c\u00f3digo de una funci\u00f3n en iterable.<\/p>\n\n\n\n<p>El ejm de arriba lo podemos transformar de la siguiente manera.<\/p>\n\n\n\n<p><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">function* iterable() {\n   \/\/ El asterisco le indica a Javascript que es un generador\n   yield \"Hola\";\n   console.log(\"Hola consola\");\n   yield \"hola 2\";\n   console.log(\"Mas instrucciones de c\u00f3digo\");\n   yield \"Hola 3\";\n   yield \"Hola 4\";\n}\n\nlet iterador = iterable();\n\n\/\/ Bucle forof para ir leyendo todos los elementos\nfor (let y of iterador) {\nconsole.log(y);\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Recolectar todos los yields en un Array<\/h2>\n\n\n\n<p>Lo har\u00edamos con la siguiente sintaxis despu\u00e9s de la \u00faltima linea de c\u00f3digo incluida en nuestro ejm.<\/p>\n\n\n\n<p><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">let arr = [...iterable()];\nconsole.log(arr);\n\/\/ Devuelve un Array con todos nuestros yields<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ejm completo<\/h2>\n\n\n\n<p>Veamos un ejm para entender mejor el uso de los <strong>generadores<\/strong>.<\/p>\n\n\n\n<p><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">function cuadrado(value) {\n  setTimeout(() =&gt; {\n    return console.log({value, resultado: value * value})\n  }, 1000);\n}\n\nfunction* generador() {\n  console.log(\"Inicia Generator\");\n  yield cuadrado(0);\n  yield cuadrado(1);\n  yield cuadrado(2);\n  yield cuadrado(3);\n  yield cuadrado(4);\n  yield cuadrado(5);\n  console.log(\"Termina Generator\");\n}\n\nlet gen = generador();\n  for (let y of gen) {\n  console.log(y);\n}<\/pre>\n\n\n\n<p>En este ejm estamos teniendo una <strong>asincron\u00eda<\/strong> con un comportamiento <strong>no bloqueante<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En el cap\u00edtulo anterior ve\u00edamos el concepto de los tipos de datos que son iterables, y de una interface que [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":766,"menu_order":5,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-782","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"En el cap\u00edtulo anterior ve\u00edamos el concepto de los tipos de datos que son iterables, y de una interface que [&hellip;]","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/782","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=782"}],"version-history":[{"count":1,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/782\/revisions"}],"predecessor-version":[{"id":783,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/782\/revisions\/783"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/766"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=782"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}