<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>javascript &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Fri, 16 Oct 2020 17:58:14 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.13</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>javascript &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Javascript &#8211; Async/Await</title>
		<link>https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/</link>
					<comments>https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 15 Mar 2019 10:00:24 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2809</guid>

					<description><![CDATA[<p>os operadores async/await permite ejecutar instrucciones de forma síncrona, evitando tener que utilizar promesas o callbacks.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/">Javascript &#8211; Async/Await</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="1024" height="560" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2-1024x560.jpg" alt="" class="wp-image-2810" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2-1024x560.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2-300x164.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2-768x420.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2-750x410.jpg 750w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2-1140x624.jpg 1140w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-2.jpg 1542w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>La finalidad de los operadores <code>async</code> y <code>await</code> es simplificar aun más la forma en que trabajamos con las promesas, de tal forma que permite ejecutarlas y esperar el resultado de forma síncrona, si la necesidad de los famosos bloques <code>then</code> y <code>catch</code>.</p>



<span id="more-2809"></span>



<p>El contenido de este artículo también lo explico por Youtube, recuerda suscribirte por que estaremos subiendo más contenido como este:</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/qY65YXZDyIk?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe>
</div></figure>



<p>Los que ya tiene tiempo utilizando Javascript, recordaran lo complicado que era trabajar con las Callback y el famoso problema llamado callback hell, por suerte, luego apetecieron las promesas, una nueva forma de resolver el problema de asincronicidad de Javascript, permitiendo definir una serie de bloques <code>then</code> y <code>catch</code> que al final eran son muy parecidas a las callback, con la diferencia de que permitía tener una mejor organización del código, sin embargo, y pesar de estas mejoras significativas, Javascript seguía teniendo el mismo problema, y era la asincronicidad.</p>



<p>Dicho lo anterior, los operadores async/await se agregan a Javascript a partir de la versión ECMAScript 7 para simplificar la forma de trabajar con las promesas, con las cuales es posible ejecutarlas de forma síncrona y bloqueando la ejecución hasta que sean resueltas.</p>



<p>Para comprender mejor como funcionan los operadores <code>async</code>/<code>await</code> vamos a realizar un ejemplo, en el cual consumiremos un recurso de Internet mediante el API Fetch. En este primer ejemplo veremos como se hace sin <code>async</code>/<code>await</code>:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">const fetch = require( 'node-fetch')

function getCountry(){
    return fetch('https://pkgstore.datahub.io/core/country-codes/country-codes_json/data/471a2e653140ecdd7243cdcacfd66608/country-codes_json.json')
        
}

let hello = getCountry()
hello.then(response => response.json())
    .then(response => response.map(country => country['CLDR display name']))
    .then(response => console.log(response))</code></pre>



<p>Cómo podemos observar, hemos creado la función <code>getCountry</code> encargada de retornar una promesa con la búsqueda de un recurso de Internet, este método es ejecutado y seguido es necesario resolver la promesa con una serie de bloques <code>then</code>. Podemos observar que estos es un poco verboso, pues en cada bloque hay que definir la variable response, definir una callback (o arrow function) y retornar los resultados para ser procesados por el siguiente bloque <code>then</code>. Otro de los problemas es que el resultado solo estará disponible dentro del bloque <code>then</code>, complicando la forma en que trabajamos y manejamos los errores.</p>



<p><a href=""></a></p>



<figure class="wp-block-image">
<a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb">
<img loading="lazy" width="1024" height="394" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-1024x394.jpg" alt="Aplicaciones reactivas con React, NodeJS &amp; MongoDB" class="wp-image-2815" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-1024x394.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-300x116.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-768x296.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner.jpg 1745w" sizes="(max-width: 1024px) 100vw, 1024px" />
</a><figcaption><a href="">¿Quieres aprender las tecnologías más importantes de la web? te invito a que veas mi libro donde aprenderás React, NodeJS y MongoDB y conviértete en un desarrollador FullStack de JavaScript</a></figcaption></figure>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Ahora bien, antes de explicar como funciona <code>async</code>/<code>await</code> quiere que veas un ejemplo, lo análisis y después pasaremos a explicar todo a detalle:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">const fetch = require( 'node-fetch')

async function getCountry(){
    let response = await fetch('https://pkgstore.datahub.io/core/country-codes/country-codes_json/data/471a2e653140ecdd7243cdcacfd66608/country-codes_json.json')
    let json = await response.json()
    return json.map(country => country['CLDR display name'])
}

(async function(){
    let hello = await getCountryAsync()
    console.log("log => ", hello)
})()</code></pre>



<p>Para empezar, vemos un código mucho más limpio, además, la función <code>getCountry</code> ejecuta todas las instrucciones de forma asíncrona. Pero que está pasado.</p>



<p>Lo primero que debemos de saber es que el operador <code>await</code> esperará hasta que la promesa sea resuelta, lo que provocará que el hilo de ejecución hasta que la promesa se resuelva, y una vez resuelta, el hilo de ejecución continuará donde se quedo.</p>



<p>Otra cosa importante, es que <code>await</code> solo se puede utilizar en funciones que tengan el operador <code>async</code>, en caso contrario, se lanzará el siguiente error:</p>



<pre class="wp-block-code"><code class="">SyntaxError: await is only valid in async function</code></pre>



<p>Los método con el operadores <code>async</code> son llamados async methods, y no solo permiten utilizar el operador <code>async</code>, si no que provocara que todo lo que retornemos sea encapsulado dentro de una promesa:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">async function helloWorld(){
    return "hello world"
}
let hello = helloWorld()
console.log(hello) 

// Output
// Promise { 'hello world' }</code></pre>



<p>En este ejemplo tenemos una función que solo regresa un string, sin embargo, vemos que en el output, el string <code>"hello world"</code> está encapsulado dentro de una promesa.</p>



<p>Regresando al ejemplo, si ejecutamos la función <code>getCountry</code>, este nos regresará un promesa, por lo que si imprimiéramos el resultado de la función podemos observar que nos regresa una promesa</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">console.log(getCountry())

// Output
// Promise { &lt;pending> }</code></pre>



<p>En este punto te podrías estar preguntando, ¿que sentido tiene utilizar await, si al final me regresará una promesa?, puede que tengas razón sin embargo, recordemos que con <code>await</code> podemos esperar hasta que se resuelva una promesa, entonces podemos hacer lo siguiente:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">(async function(){
    let hello = await getCountry()
    console.log("log => ", hello)
})

// Output
// 'Guinea-Bissau',
//  'Guyana',
//  'Haiti',
//  ... 150 more items ]</code></pre>



<p>En este ejemplo, vemos que hemos ejecutado la función <code>getCountry</code> dentro de una async method por lo que podríamos utilizar <code>await</code> para resolver la respuesta de <code>getCountry</code>.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Excepciones</h2>



<p>Otra de las grandes ventajas que ofrece el operadores <code>async</code>/<code>await</code> es que nos permite controlar las excepciones mediante el clásico bloque try-catch, sin necesidad de utilizar bloque <code>.catch()</code> de las promesas:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">async function getCountry(){
    try {
        let response = await fetch('https://pkgstore.datahub.io/core/country-codes/country-codes_json/data/471a2e653140ecdd7243cdcacfd66608/country-codes_json.json')
        let json = await response.json()
        return json.map(country => country['CLDR display name'])
    } catch (err) {
        console.log("Error ==> ", err)
    }
}</code></pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Cómo hemos podido comprobar, los operadores <code>async</code>/<code>await</code> proporcionan una forma mucho más imple para trabajar con promesas, permitiendo trabajar de forma síncrona.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/">Javascript &#8211; Async/Await</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/03/15/javascript-async-await/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2809</post-id>	</item>
		<item>
		<title>Javascript &#8211; la función filter</title>
		<link>https://www.oscarblancarteblog.com/2019/03/12/javascript-la-funcion-filter/</link>
					<comments>https://www.oscarblancarteblog.com/2019/03/12/javascript-la-funcion-filter/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 12 Mar 2019 16:00:45 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2800</guid>

					<description><![CDATA[<p>La función filter permite filtrar los elementos de un array y generar uno nuevo con todos los elementos que cumplen una determinada condición. Puedes ver toda esta mis explicación mi video de Youtube, no olvides suscribirte, subimos videos con regularidad: Sin lugar a duda, filter es una de las funciones más importantes a la hora [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/03/12/javascript-la-funcion-filter/">Javascript &#8211; la función filter</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="1024" height="573" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1-1024x573.jpg" alt="" class="wp-image-2801" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1-1024x573.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1-300x168.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1-768x430.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1.jpg 1508w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>La función <code>filter</code> permite filtrar los elementos de un array y generar uno nuevo con todos los elementos que cumplen una determinada condición.</p>



<span id="more-2800"></span>



<p><div>Puedes ver toda esta mis explicación mi video de Youtube, no olvides suscribirte, subimos videos con regularidad:</div></p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/qK35GU_vzTU?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe>
</div></figure>



<p>Sin lugar a duda, <code>filter</code> es una de las funciones más importantes a la hora de trabajar con arreglos, pues permite filtrar fácil y rápido los elementos de un array sin afectar el array original, respetando la <em>inmutabilidad </em>del array original.</p>



<blockquote class="wp-block-quote"><p>Quizás te interese ver como funciona <a href="https://www.oscarblancarteblog.com/2019/03/11/javascript-la-funcion-map/">la función map</a></p></blockquote>



<p>La función <code>filter</code> está definida en <code>Array.prototype</code>, lo que hace que todos los arrays cuente con esta función por default. Como parte de su definición, filter acepta como parámetro una función (<code>callback</code>) la cual se ejecutará por cada elemento del array y deberá de retornar <code>true</code> para indicar que el elemento actual debe de ser incluido en el nuevo array o <code>false</code> en caso contrario. Veamos un ejemplo:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">let numArray = [1,2,3,4,5,6,7,8,9,10] 
let filterNumArray = numArray.filter(element => element > 5)

console.log("numArray => ", numArray)
console.log("filterNumArray => ", filterNumArray)

//Output
//numArray =>  [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
//filterNumArray =>  [ 6, 7, 8, 9, 10 ]</code></pre>



<p>En este ejemplo hemos creado el array <code>numArray</code>, el cual cuenta 10 número, seguido, utilizamos la función <code>filter</code> para filtrar todos los números mayores a 5, dando como resultado el array <code>filterNumArray</code>, el cual es nuevo arreglo. </p>



<p>Finalmente podemos comprobar el resultado de la ejecución, donde el array original <code>numArray</code> permanece intacto, es decir, no fue mutado, por otro lado, se creo el nuevo array <code>filterNumArray</code> que contiene solo los número mayores a 5.</p>



<p>Hace un momento dijimos que <code>filter</code> recibe una función como parámetro, pero a partir de la versión ECMAScript 6, es posible enviarle una Arrow funtion, la cual tiene el mismo resultado que enviarle una función, veamos las diferencias:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">//ECMAScript 5
var filterNumArray = numArray.filter(function(element) { return element > 5})
//ECMAScript 6
let filterNumArray = numArray.filter(element => element > 5)</code></pre>



<p>El resultado será el mismo, la única diferencia es que las expresiones Arrow Functions son más limpias y memos verbosas</p>



<figure class="wp-block-image is-resized"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noreferrer noopener"><img loading="lazy" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-sm.jpg" alt="Aplicaciones reactivas con react, nodejs y mongodb" class="wp-image-2779" width="581" height="196" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-sm.jpg 511w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-sm-300x101.jpg 300w" sizes="(max-width: 581px) 100vw, 581px" /></a><figcaption>¿Quieres aprender a crear aplicaciones web desde cero? te invito a que veas mi nuevo libro, donde aprenderás a crear aplicaciones web con React, y un API Rest con NodeJS.</figcaption></figure>



<h2>Parámetros disponibles</h2>



<p>La función que enviamos a filter no solo recibe el elemento actual del array, si no que tiene otros parámetros que podemos definir de forma opcional cuando sea necesario:</p>



<ul><li>element: elemento actual que está siendo procesado</li><li>index: corresponde a la posición (<code>index</code>) del <code>element</code> dentro del array.</li><li>array: corresponde al array original que estamos filtrando.</li></ul>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">newProductsArray = productsArray.filter((product, index) => index > 2)
console.log("newProductsArray => ", newProductsArray)
//newProductsArray =>  [ 
//  { id: 4, name: 'watermelon', price: 400 },
//  { id: 5, name: 'grape', price: 500 } 
//]</code></pre>



<p>En este nuevo ejemplo hemos filtrado todos los elementos que su index sea mayor a 2.</p>



<p>Cabe mencionar que si bien, filter no muta el array original, hay que tener cuidado con el parámetro array, pues este corresponde al array original, por lo que cualquier cambio que realicemos sobre el, tendrá un impacto sobre el array original, provocando su mutación, lo cual es considerado un anti-pattern y siempre debe de ser evitado.</p>



<div style="height:24px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Cabe mencionar que si bien, la función filter no muta el array original, si que es posible mutarlo mediante el parámetro array, el cual contiene el array original y que desde la función </p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/03/12/javascript-la-funcion-filter/">Javascript &#8211; la función filter</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/03/12/javascript-la-funcion-filter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2800</post-id>	</item>
		<item>
		<title>Javascript &#8211; la función map</title>
		<link>https://www.oscarblancarteblog.com/2019/03/11/javascript-la-funcion-map/</link>
					<comments>https://www.oscarblancarteblog.com/2019/03/11/javascript-la-funcion-map/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 11 Mar 2019 12:45:14 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2784</guid>

					<description><![CDATA[<p>Mediante la función map es posible crear un nuevo arreglo a partir de uno existente, tan simple como eso ¿o no?. Puedes ver este mismo artículo en mi canal de Youtube, y no olvides suscribirte subo videos con regularidad: Sin lugar a duda, la función map es una de las más importantes al momento de [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/03/11/javascript-la-funcion-map/">Javascript &#8211; la función map</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img loading="lazy" width="1024" height="573" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1024x573.jpg" alt="Javascript map functio" class="wp-image-2785" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-1024x573.jpg 1024w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-300x168.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner-768x430.jpg 768w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/banner.jpg 1508w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Mediante la función <code>map</code> es posible crear un nuevo arreglo a partir de uno existente, tan simple como eso ¿o no?.</p>



<span id="more-2784"></span>



<p>Puedes ver este mismo artículo en mi canal de Youtube, y no olvides <a href="https://www.youtube.com/channel/UCaDtXOU301UgSghUuHwkelw?sub_confirmation=1">suscribirte</a> subo videos con regularidad:</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/R4qT9MBmZIU?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe>
</div></figure>



<p>Sin lugar a duda, la función <code>map</code> es una de las más importantes al momento de trabajar con arreglos, pues permite iterar y controlar la forma en que procesaremos cada unos de los elementos del arreglo en un solo paso. Veamos el siguiente ejemplo:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">let numArray = [1,2,3,4,5,6,7,8,9,10]
let numArray2 = numArray.map(current => current*2)

console.log("numArray => ",  numArray)
console.log("numArray2 => ", numArray2)

// Output
// numArray =>  [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
// numArray2 =>  [ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 ]</code></pre>



<p>Cómo podemos comprobar en el fragmento de código anterior, la función <code>map</code> siempre regresará un nuevo arreglo, dejando intacto el arreglo origen, esto es importante por que mantiene la <em>inmutabilidad </em>del array origen, permitiendo crear tantas variantes del arreglo original sin afectar el original.</p>



<p>La función <code>map</code> recibe cómo parámetro una función (<code>callback</code>) la cual se ejecutará para cada elemento del array, sin embargo, en ECMAScript 6 es posible utiliza <em>Arrow Functions</em> en lugar de una <code>callback</code>. Veamos las diferencias:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">//ECMAScript 6
let numArray2 = numArray.map(current => current*2)

//ECMAScript 5
var numArray2 = numArray.map(function(current)  {
    return current*2}
)</code></pre>



<p>Con la función <code>map</code> es posible no solo procesar arrays de tipos primitivos, si no que podemos procesar objetos completos. Veamos este otro ejemplo:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">let orders = [
    {
        orderNum: 1,
        total: 100,
        customer: {
            name: "Oscar Blancarte"
        }
    },{
        orderNum: 2,
        total: 200,
        customer: {
            name: "Carlos Raygoza"
        }
    },{
        orderNum: 3,
        total: 300,
        customer: {
            name: "Andres Bedoya"
        }
    }
]

let simpleOrders = orders.map(order => {return {orderNum: order.orderNum, total: order.total, customerName: order.customer.name}})

console.log("orders => ",       orders)
console.log("simpleOrders => ", simpleOrders)

// orders =>  [ { orderNum: 1,
//     total: 100,
//     customer: { name: 'Oscar Blancarte' } },
//   { orderNum: 2, total: 200, customer: { name: 'Carlos Raygoza' } },
//   { orderNum: 3, total: 300, customer: { name: 'Andres Bedoya' } } ]

// simpleOrders =>  [ { orderNum: 1, total: 100, customerName: 'Oscar // Blancarte' },
//   { orderNum: 2, total: 200, customerName: 'Carlos Raygoza' },
//   { orderNum: 3, total: 300, customerName: 'Andres Bedoya' } ]</code></pre>



<p>En este nuevo ejemplo hemos convertido un arreglo de ordenes a un nuevo arreglo más simple. Por si no lo notaste, hemos simplificado el array origen, al pasar el nombre del cliente directamente sobre el objeto de la orden. </p>



<p>Ahora bien, podemos utilizar la función map de forma anidada, para simplificar los arrays todavía más. Imagina que las ordenes anteriores puedan tener dentro un array de productos, y necesitemos sacar solo los productos y el cliente al que pertenece:</p>



<pre class="wp-block-code"><code lang="javascript" class="language-javascript line-numbers">let orders = [
    {
        customer: {
            name: "Oscar Blancarte"
        },
        products: [
            {
                id: 1,
                name: "Banana"
            },{
                id: 2,
                name: "strawberry"
            }
        ]
    },{
        customer: {
            name: "Carlos Raygoza"
        },
        products: [
            {
                id: 3,
                name: "apple"
            },{
                id: 2,
                name: "strawberry"
            }
        ]
    },{
        customer: {
            name: "Andres Bedoya"
        },
        products: [
            {
                id: 4,
                name: "Watermelon"
            },{
                id: 2,
                name: "apple"
            },{
                id: 1,
                name: "Banana"
            }
        ]
    }
]

let simpleOrders = orders.map(order => {
    return order.products.map(product => {return {customer: order.customer.name, product: product.name}})
})

console.log("simpleOrders => ", simpleOrders)

// simpleOrders =>  [ [ { customer: 'Oscar Blancarte', product: 'Banana' },
//     { customer: 'Oscar Blancarte', product: 'strawberry' } ],
//   [ { customer: 'Carlos Raygoza', product: 'apple' },
//     { customer: 'Carlos Raygoza', product: 'strawberry' } ],
//   [ { customer: 'Andres Bedoya', product: 'Watermelon' },
//     { customer: 'Andres Bedoya', product: 'apple' },
//     { customer: 'Andres Bedoya', product: 'Banana' } ] ]</code></pre>



<p>En este nuevo ejemplo hemos pasado de un array con un objeto muy complejo a un un array con tan solo el nombre del cliente y el producto, evitando tener toda la estructura original.</p>



<p>Sin embargo, hay un pequeño detalle, y es que el nuevo array generado es un array de arrays, es decir, todos los productos de un mismo clientes están dentro de un array, esto se debe a que el <code>map</code> que usamos sobre los productos retorna un array, y luego, ese array es retornado para el <code>map</code> que usamos sobre el objeto <code>orders</code>, y como <code>map</code> regresa un array, entonces lo que hace es generar un array con cada array retornado por los <code>products</code>.</p>



<p>Para solucionar este problema es necesario utiliza la función <em>reduce </em>de la que hablaremos en otra ocasión. Déjanos un comentario si quieres que continuemos hablando de la función reduce.</p>



<div class="wp-block-image"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" alt=""><figure class="aligncenter is-resized"><img loading="lazy" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-sm.jpg" alt="Aplicaciones reactivas con react, nodejs y mongodb" class="wp-image-2779" width="528" height="178" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-sm.jpg 511w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/react-banner-sm-300x101.jpg 300w" sizes="(max-width: 528px) 100vw, 528px" /><figcaption>¿Te gusta Javascript, te invito a que descubras mi libro para convertirte en un desarrollador FullStack en JS?</figcaption></figure></a></div>



<p>Hace un momento dijimos que map recibe una función, sin embargo, falto detallar que esta función puede recibir 3 parámetros, los cuales son los siguientes:</p>



<ul><li>currentValue: elemento actual que se esta procesando.</li><li>index: corresponde a la posición (<em>index</em>) donde se encuentra el <em>currentValue</em> dentro del array.</li><li>array: corresponde al array original que estamos procesando.</li></ul>



<p>Cabe mencionar que si bien la función <code>map</code> no muta el array original, hay que tener cuidado con el parámetro <code>array</code>, pues dentro de la función callback podríamos mutar el array original, lo cual es un <em>anti-patrón</em>, pues debemos respetar la inmutabilidad de los parámetros.</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Cómo hemos podido observar, la función map es muy util para crear variaciones de un array, permitiendo en un solo paso, crear un array a partir de otro.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/03/11/javascript-la-funcion-map/">Javascript &#8211; la función map</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/03/11/javascript-la-funcion-map/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2784</post-id>	</item>
		<item>
		<title>React Props (Propiedades)</title>
		<link>https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/</link>
					<comments>https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 04 Oct 2018 17:00:24 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[react]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2340</guid>

					<description><![CDATA[<p>Las propiedades son la forma que tiene React para pasar parámetros de un componente padre a los hijos.normal que un componente pase datos a los componentes hijos, sin embargo, no es lo único que se puede pasar, si no que existe ocasiones en las que los padres mandar funciones a los hijos, para que estos [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/">React Props (Propiedades)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter wp-image-2347 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/react-props-1-1024x573.jpg" alt="React props (propiedades)" width="648" height="363" />Las propiedades son la forma que tiene React para pasar parámetros de un componente padre a los hijos.normal que un componente pase datos a los componentes hijos, sin embargo, no es lo único que se puede pasar, si no que existe ocasiones en las que los padres mandar funciones a los hijos, para que estos ejecuten operaciones de los padres, puede sonar extraño, pero ya veremos cómo funciona.<span id="more-2340"></span></p>
<p>Los props se envían a los componentes al momento de crearlos, y es tan fácil como mandar las propiedades como un atributo del <span class="lang:default decode:true crayon-inline ">&lt;tag&gt;</span>  del componente, por ejemplo, supongamos que tenemos un componente <span class="lang:default decode:true crayon-inline ">&lt;ItemList&gt;</span> , el cual necesita recibir los datos de un producto, dicho producto debe contener el nombre y un precio:</p>
<pre class="lang:js decode:true">&lt;ItemList product={item}/&gt;</pre>
<p>Mandar objetos es una forma simple y limpia de mandar propiedades, pero también lo podríamos hacer en varias propiedades, por ejemplo:</p>
<pre class="lang:js decode:true ">&lt;ItemList productName={product.name} productPrice={product.price}/&gt;</pre>
<p>La única diferencia entre estos dos métodos será la forma de recuperar las propiedades. Para recuperar una propiedad es necesario usar el prefijo, <span class="lang:default decode:true crayon-inline ">this.props</span> , por lo que en el primer ejemplo, el ítem se recupera como <span class="lang:default decode:true crayon-inline ">this.props.product</span> , y en el segundo ejemplo, sería <span class="lang:default decode:true crayon-inline ">this.props.productName</span>  para el nombre y <span class="lang:default decode:true crayon-inline ">this.props.productPrice</span>  para el precio.</p>
<p>Una limitación que tenemos para mandar props, es la de no utilizar un nombre de propiedad que coincida con los atributo de React, por ejemplo: <span class="lang:default decode:true crayon-inline ">onClick</span> , <span class="lang:default decode:true crayon-inline ">onChange</span> , <span class="lang:default decode:true crayon-inline ">className</span> , etc.</p>
<p>&nbsp;</p>
<blockquote><p><strong><em>Las propiedades son inmutables</em></strong><br />
La propiedad tiene la característica de ser inmutables, es decir, no debemos de modificarlas o actualizarlas, pues es considerada una mala práctica, solo las debemos utilizar de modo lectura.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Regresemos al ejemplo del formulario que vimos en la sección de <span style="color: #ff0000;">componentes con estado y sin estado<span style="color: #000000;"> del que hablamos en un artículo pasado</span></span>. En este ejemplo, creamos el componente <span class="lang:default decode:true crayon-inline ">App</span>  y sobre este montamos un formulario de registro de empleados. Ahora bien, ¿qué pasaría si quisiéramos que la acción de guardar la controlara el componente padre? La solución es simple, el componente padre tendría que enviar como props la función de guardar, para que el hijo la ejecute.</p>
<p>Lo primero será pasar el formulario a un componente externo, por lo cual, crearemos un componente llamado <span class="lang:default decode:true crayon-inline">EmployeeForm</span> , el cual se verá como a continuación:</p>
<pre class="lang:js mark:44 decode:true" title="EmployeeForm.js">import React from 'react'

class EmployeeForm extends React.Component{

  constructor(){
    super(...arguments)
    this.state = {
      firstName: '',
      lastName: '',
      age: ''
    }
  }

  componentDidMount(){
    this.refs.firstName.focus();
  }

  handleChanges(e){
    let newState = Object.assign(
      this.state, {[e.target.id]: e.target.value})
    this.setState(newState)
  }

  saveEmployee(e){
    this.props.save(this.state)
  }

  render(){
    return (
      &lt;form&gt;
        &lt;label htmlFor='firstName'&gt;Nombre&lt;/label&gt;
        &lt;input ref='firstName' id='firstName'
          type='text' value={this.state.firstName}
          onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt;
        &lt;label htmlFor='lastName'&gt;Apellido&lt;/label&gt;
        &lt;input id='lastName' type='text' value={this.state.lastName}
          onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt;
        &lt;label htmlFor='age'&gt;Edad&lt;/label&gt;
        &lt;input id='age' type='number' value={this.state.age}
          onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt;
        &lt;button onClick={this.saveEmployee.bind(this)}&gt;Guardar&lt;/button&gt;
      &lt;/form&gt;
    )
  }
}
export default EmployeeForm</pre>
<p>Este componente tiene dos cosas a resaltar, lo primero es que agregamos un botón (línea 44), el cual, al ser presionado, ejecutar la función <span class="lang:default decode:true crayon-inline">saveEmployee</span>  declarada en este mismo componente, lo segundo es la función <span class="lang:default decode:true crayon-inline">saveEmployee</span>  que declaramos en la línea 24, la cual ejecuta la función <span class="lang:default decode:true crayon-inline ">save</span>  enviada por el parent como prop.</p>
<p>Por otra parte, tenemos al componente <span class="lang:default decode:true crayon-inline ">App</span>  que será el padre del componente anterior:</p>
<pre class="lang:js decode:true" title="App.js">import React from 'react'
import { render } from 'react-dom'
import EmployeeForm from './EmployeeForm'

class App extends React.Component{
  
  save(employee){ 
    alert(JSON.stringify(employee))
  } 
		
  render(){
    return (
	  &lt;EmployeeForm save={ this.save.bind(this) }/&gt; 
	) 
  } 
} 
render(&lt;App/&gt;, document.getElementById('root'));</pre>
<p>Podemos ver que al momento de crear el componente <span class="lang:default decode:true crayon-inline ">EmployeeForm</span> , este le envía como una prop la función <span class="lang:default decode:true crayon-inline ">save</span> . De esta forma, cuando el componente <span class="lang:default decode:true crayon-inline ">EmployeeForm</span> , ejecute la propiedad, se lanzará una alerta con los datos capturados (línea 8).</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2345" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/react-props.jpg" alt="" width="713" height="312" /></p>
<p>&nbsp;</p>
<p>Cuando es necesario &#8220;<em>bindear</em>&#8221; una función con una prop o queremos utilizar una función en un evento como <span class="lang:default decode:true crayon-inline ">onClick</span> , <span class="lang:default decode:true crayon-inline ">onChange</span> , etc. es necesario siempre empezar con <span class="lang:default decode:true crayon-inline ">this</span> , y finalizar con <span class="lang:default decode:true crayon-inline ">binding(this)</span>  como se ve a continuación <span class="lang:default decode:true crayon-inline">this.&lt;function&gt;.bind(this)</span> .</p>
<p>&nbsp;</p>
<p>Debido a que un componente padre puede enviar cualquier propiedad a sus componentes hijos, React proporciona un mecanismo para validar las propiedades que espera un determinado componente, validar su estructura, tipo de dato y definir un valor por default, para eso existen dos términos llamados PropTypes y DefaultProps, de los cuales estaremos hablando en otra ocasión.</p>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos visto, las propiedades son el único método que ofrece React para transmitir información de forma descendente, desde un componente padre hacia sus hijos, sin embargo, existe otras alternativas como <a href="https://es.redux.js.org/">Redux</a>, una librería que permite gestionar la información de la aplicación totalmente desacoplada de los componentes.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/">React Props (Propiedades)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2340</post-id>	</item>
		<item>
		<title>Componentes con estado y sin estado</title>
		<link>https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/</link>
					<comments>https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 26 Sep 2018 17:00:11 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[react]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2311</guid>

					<description><![CDATA[<p>Una característica de los componentes, es su estado, el cual determina tanto la información que se muestras en pantalla, hasta como se representa la información, de esta forma, el estado puede cambiar la apariencia gráfica de un componente y la forma en que se muestra la información. Un ejemplo básico de un estado, es, por [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/">Componentes con estado y sin estado</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter wp-image-2320 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componentes-con-estado-sin-estado-1024x573.jpg" alt="Componentes con estado y sin estado" width="648" height="363" /></p>
<p>Una característica de los componentes, es su estado, el cual determina tanto la información que se muestras en pantalla, hasta como se representa la información, de esta forma, el estado puede cambiar la apariencia gráfica de un componente y la forma en que se muestra la información. Un ejemplo básico de un estado, es, por ejemplo, un formulario que puede pasar de modo lectura a escritura.<span id="more-2311"></span></p>
<p><figure id="attachment_2312" aria-describedby="caption-attachment-2312" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2312 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/cambio-estado-componente-1024x516.png" alt="Cambio de estado en un componente" width="648" height="327" /><figcaption id="caption-attachment-2312" class="wp-caption-text">Cambio de estado en un componente</figcaption></figure></p>
<p>&nbsp;</p>
<p>Como vemos en la imagen, una componente puede pasar de un formulario que no permite la edición, a otro donde los valores se muestran en <span class="lang:default decode:true crayon-inline">&lt;input&gt;</span>  para que el usuario pueda cambiar sus valores. Al guardar los cambios, el componente puede regresar a su estado principal. No vamos a entrar en los detalles de lo que es un estado, ni cómo es posible modificarlo, pues eso lo podremos para más adelante, por ahora, solo quiero que tengas una idea de lo que es el estado y cómo puede afectar la forma en que se muestra un componente.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Componentes sin estado</h2>
<p>Este tipo de componentes son los más simples, pues solo se utilizan para representar la información que les llega como parámetros. En algunas ocasiones, estos componentes pueden transformar la información con el único objetivo de mostrarla en un formato más amigable, sin embargo, estos compontes no consumen datos de fuentes externas ni modifican la información que se les envía.</p>
<p>&nbsp;</p>
<blockquote><p><em>Los componentes sin estado también son llamados componentes de presentación, pero son mejor conocidos como Stateless Component por su nombre en inglés.</em></p></blockquote>
<p>&nbsp;</p>
<p>Para ejemplificar mejor este tipo de componentes vamos a analizar el siguiente archivo llamado <span class="lang:default decode:true crayon-inline">ItemList.js</span> , el cual representará un ítem de una lista de productos:</p>
<pre class="lang:js decode:true " title="ItemList.js">import React from 'react' 
class ItemList extends React.Component{ 
  constructor(props){ 
	super(props) 
  } 
  
  render(){ 
    return( 
	  &lt;li&gt;{this.props.product.name} - {this.props.product.price}&lt;/li&gt; 
	) 
  }
 } 
 export default ItemList</pre>
<p>Este componte utiliza algo que hasta ahora no habíamos utilizado, las Props, las cuales son parámetros que son enviados durante la creación del componente. En este caso, se le envía una propiedad llamada product, la cual debe de tener un nombre (<span class="lang:default decode:true crayon-inline ">name</span> ) y un precio (<span class="lang:default decode:true crayon-inline ">price</span> ).</p>
<p>&nbsp;</p>
<blockquote><p>Las propiedades o simplemente props, son parámetros que se le envían a un componente durante su creación. Los props pueden ser datos para mostrar o información para inicializar el estado. Como regla general, las props son inmutables, lo que quieres decir, que son de solo lectura. Para obtener las propiedades de un componente es necesario obtenerlas mediante el prefijo <span class="lang:default decode:true crayon-inline ">this.props</span> , seguido del nombre de la propiedad.</p></blockquote>
<p>&nbsp;</p>
<p>Observemos que el componente <span class="lang:default decode:true crayon-inline">ItemList</span>  solo muestra las propiedades que recibe como parámetro, sin realizar ninguna actualización sobre ella.<br />
Para completar este ejemplo, crearemos el componente <span class="lang:default decode:true crayon-inline ">App</span>  que quedará de la siguiente manera:</p>
<pre class="lang:js decode:true" title="App.js">import React from 'react' 
import { render } from 'react-dom' 
import ItemList from './ItemList' 

class App extends React.Component{ 
  render(){
    let items = [{ 9. name: 'Item 1', 10. price: 100 11. }, { 12. name: 'Item 2', 13. price: 200 14. }] 
	
	return ( 
	  &lt;ul&gt; 
	    &lt;For each="item" index='index' of={ items }&gt; 
		  &lt;ItemList product={item}/&gt;
		&lt;/For&gt; 
	  &lt;/ul&gt; 
	)
  } 
}

render(&lt;App/&gt;, document.getElementById('root'));</pre>
<p>Veamos que hemos creado un array de ítems (línea 8), los cuales cuentan con un nombre y un precio. Seguido, iteramos los ítems para crear un componente <span class="lang:default decode:true crayon-inline ">&lt;ItemList&gt;</span>  por cada ítem de la lista, también le mandamos los datos del producto mediante la propiedad <span class="lang:default decode:true crayon-inline ">product</span> , la cual podrá ser accedida por el componente <span class="lang:default decode:true crayon-inline ">&lt;ItemList&gt;</span>  utilizando la instrucción <span class="lang:default decode:true crayon-inline ">this.props.product</span> .</p>
<p>Otra cosa importante a notar, es la línea 3, pues en ella se realiza la importación del nuevo componente para poder ser utilizando.</p>
<p><figure id="attachment_2314" aria-describedby="caption-attachment-2314" style="width: 774px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2314 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componenete-state-test.jpg" alt="Componentes sin estado" width="774" height="475" /><figcaption id="caption-attachment-2314" class="wp-caption-text">Componentes sin estado</figcaption></figure></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Componentes con estado</h2>
<p>Los componentes con estado se distinguen de los anteriores, debido a que estos tienen un estado asociado al componente, el cual se manipula a mediad que el usuario interactúa con la aplicación. Este tipo de componentes en ocasiones consumen servicios externos para recuperar o modificar la información.</p>
<p>Un ejemplo típico de componentes con estados, son los formularios, pues es necesario ligar cada campo a una propiedad del estado, el cual, al modificar los campos afecta directamente al estado. Veamos cómo quedaría un componente de este tipo. Regresaremos al componente <span class="lang:default decode:true crayon-inline ">App</span>  y lo dejaremos de la siguiente manera:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true" title="App.js">import React from 'react' 
import { render } from 'react-dom' 
import ItemItem from './ItemList' 

class App extends React.Component{ 
  constructor(){ 
    super(...arguments) 
       this.state = { 
       firstName: '', 
       lastName: '', 
       age: '' 
      }  
  } 
  
  handleChanges(e){ 
    let newState = Object.assign(this.state, {[e.target.id]: e.target.value}) 
    this.setState(newState) 
  } 

  render(){ 
    return ( 
      &lt;form&gt; 
        &lt;label htmlFor='firstName'&gt;Nombre&lt;/label&gt; 
        &lt;input id='firstName' type='text' value={this.state.firstName}  onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt; 
        &lt;label htmlFor='lastName'&gt;Apellido&lt;/label&gt; 
        &lt;input id='lastName' type='text' value={this.state.lastName}  onChange={this.handleChanges.bind(this)}/&gt; 
        &lt;br/&gt; 
        &lt;label htmlFor='age'&gt;Edad&lt;/label&gt; 
        &lt;input id='age' type='number' value={this.state.age}  onChange={this.handleChanges.bind(this)}/&gt; 
      &lt;/form&gt; 
    ) 
  } 
} 
render(&lt;App/&gt;, document.getElementById('root'));</pre>
<p>&nbsp;</p>
<p>No vamos a entrar en detalle acerca de los estados, ni cómo se actualizan, más adelante lo veremos, por lo que solo te cuento rápido que está pasando.<br />
Primero que nada, vemos que en el constructor se establece el estado inicial del componente, el cual tiene un <span class="lang:default decode:true crayon-inline ">firstName</span>  (nombre), <span class="lang:default decode:true crayon-inline ">lastName</span>  (apellido) y <span class="lang:default decode:true crayon-inline ">ege</span>  (edad). Los cuales están inicialmente en blanco.<br />
Seguido tenemos la función genérica <span class="lang:default decode:true crayon-inline ">handleChanges</span>  que modifica el estado a medida que vamos capturando valores en los campos de texto. Y finalmente en el método <span class="lang:default decode:true crayon-inline ">render</span> , retornamos 3 campos, correspondientes a las 3 propiedades del estado, adicional, cada campo está ligado a una propiedad del estado mediante la propiedad <span class="lang:default decode:true crayon-inline ">value</span> . Cuando el usuario captura valores en los campos, se dispara la función <span class="lang:default decode:true crayon-inline ">handleHanges</span>  para actualizar el estado.</p>
<p>&nbsp;</p>
<p><figure id="attachment_2316" aria-describedby="caption-attachment-2316" style="width: 670px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2316 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componenete-state-test2.jpg" alt="Componente con estado" width="670" height="352" /><figcaption id="caption-attachment-2316" class="wp-caption-text">Componente con estado</figcaption></figure></p>
<p>&nbsp;</p>
<p>Seguramente al ver esta imagen, no quede muy claro que está pasando con el estado, es por eso que utilizaremos el plugin <em>React Developer Tools</em> que puedes descargar desde chrome para analizar mejor como es que el estado se actualiza. Para esto, nos iremos al inspector, luego seleccionaremos el <em>Tab React</em>:</p>
<p><figure id="attachment_2317" aria-describedby="caption-attachment-2317" style="width: 802px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2317 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componenete-state-test3.jpg" alt="Inspeccionando un componente con estado" width="802" height="515" /><figcaption id="caption-attachment-2317" class="wp-caption-text">Inspeccionando un componente con estado</figcaption></figure></p>
<p>&nbsp;</p>
<p>Una vez en el <em>tab React</em>, seleccionamos el tag <span class="lang:default decode:true crayon-inline ">&lt;App&gt;</span>  y del lado izquierdo veremos las propiedades y el estado. Con el inspector abierto, actualiza los campos de texto y verás cómo el estado también cambia.</p>
<p>&nbsp;</p>
<blockquote><p>Se le conoce como componente con estado, a aquellos componentes que tiene estado y que adicional, manipulan el estado a medida que el usuario interactúa con ellos. Estos componentes también son conocidos como Componentes Contenedores, pero es más común llamarlos Stateful Components, por su nombre en inglés.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><figure id="attachment_2293" aria-describedby="caption-attachment-2293" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="Aplicaciones reactivas con React, NodeJS &amp; MongoDB" width="648" height="249" /></a><figcaption id="caption-attachment-2293" class="wp-caption-text">¿Quieres aprender React como un profesional? te invito a que veas mi nuevo libro</figcaption></figure></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos podido analizar en este artículo, existen dos tipos de componentes, con estado y sin estado, los cuales podrán ser utilizados según las necesidades que tengamos. Recordemos que los componentes sin estado solo se utilizan para representar las propiedades enviadas como parámetros o mostrar una estructura estática, mientras que los componentes con estados permiten interacturar con un estado que representa la información interna del componente, lo que les permite afectar la forma en que se ven y la como muestran los datos antes el usuario.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/">Componentes con estado y sin estado</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2311</post-id>	</item>
		<item>
		<title>Javascript se está comiendo el mundo [VIDEO]</title>
		<link>https://www.oscarblancarteblog.com/2018/08/19/javascript-se-esta-comiendo-mundo-video/</link>
					<comments>https://www.oscarblancarteblog.com/2018/08/19/javascript-se-esta-comiendo-mundo-video/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 20 Aug 2018 02:33:25 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[react]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2254</guid>

					<description><![CDATA[<p>Es impresionante pensar como JavaScript, un lenguaje desarrollados en los 80’s con el único objetivo proporcionar validaciones de formularios y alertas a los usuarios, se ha convertido en el lenguaje de programación más utilizado en el mundo, sobre pasando a lenguajes tan populares como Java o Python y ejecutándose prácticamente en todos lados, desde FrontEnd, [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/19/javascript-se-esta-comiendo-mundo-video/">Javascript se está comiendo el mundo [VIDEO]</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/JrAFUc4LkCE?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>Es impresionante pensar como JavaScript, un lenguaje desarrollados en los 80’s con el único objetivo proporcionar validaciones de formularios y alertas a los usuarios, se ha convertido en el lenguaje de programación más utilizado en el mundo, sobre pasando a lenguajes tan populares como Java o Python y ejecutándose prácticamente en todos lados, desde FrontEnd, BackEnd y Dispositivos Móviles.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/19/javascript-se-esta-comiendo-mundo-video/">Javascript se está comiendo el mundo [VIDEO]</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/08/19/javascript-se-esta-comiendo-mundo-video/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2254</post-id>	</item>
		<item>
		<title>Autenticación con JSON Web Tokens</title>
		<link>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/</link>
					<comments>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 08 Jun 2017 10:00:51 +0000</pubDate>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1732</guid>

					<description><![CDATA[<p>Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/">Autenticación con JSON Web Tokens</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter size-full wp-image-1738" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JSON-Web-Tokens.png" alt="JSON Web Tokens" width="1379" height="847" />Los JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser autenticado.<span id="more-1732"></span></p>
<h2>Que es un Token</h2>
<p>Lo primero que debemos de entender, es que es un token, pues será un concepto fundamental para entender el resto del artículo.</p>
<p>Un token es una cadena alfanumérica con caracteres aparentemente aleatorios, como el siguiente:</p>
<pre class="">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ</pre>
<p>o el siguiente:</p>
<pre class="">24353689</pre>
<p>Estas cadenas de texto, pueden no aparentar un significado, sin embargo, tiene un significado real para el servidor o institución que lo emitió, el cual puede entender y así, validar al usuario que intenta acceder a la información, e incluso, puede tener datos adicionales.</p>
<p>Te dejo un video donde explico que es un Token:</p>
<p><iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/CxeNGqZ_US8?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>Un caso simple de tokens, es el dispositivo que dan los bancos para realizar transacciones desde internet, este token te genera un valor numérico que luego tenemos que ingresar al sistema, para que de esta forma, el portal pueda asegurarse de que efectivamente somos nosotros y no un impostor.</p>
<p><img loading="lazy" class="aligncenter wp-image-1733" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/bank-token.png" alt="" width="974" height="351" /></p>
<p>En el caso de los tokens bancarios, no se almacena una información real dentro del Token, sino que simplemente es un valor generado que luego puede ser validado por el banco como un valor real generado por nuestro token. Sin embargo, con JWT podemos enviar cualquier dato del cliente dentro del token para que el servidor pueda obtener mucha más información de nosotros.</p>
<h2>Que son los JSON Web Tokens</h2>
<p>Bien, una vez que comprendemos que son los Tokens podemos decir que los JWT son un tipo de token el cual engloba una estructura, la cual puede ser desencriptada por el servidor y de esta forma, autenticarnos como usuario en la aplicación.</p>
<p>Veamos la estructura de un JWT:</p>
<p><span style="color: #ff00ff;">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9</span>.<span style="color: #00ccff;">eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9</span>.<span style="color: #ff0000;">TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ</span></p>
<p>Observemos que la cadena está dividida en 3 secciones separadas por un punto. Estas tres secciones tienen un significado:</p>
<ol>
<li><strong>HEADER:</strong> la primera parte, corresponde a los Header, y se almacena por lo general el tipo de token y el algoritmo de encriptamiento.</li>
<li><strong>PAYLOAD:</strong> La segunda parte, contiene los datos que identifican al usuario, como puede ser su ID, nombre de usuario, etc.</li>
<li><strong>FIRMA:</strong> La tercera parte es la firma digital, la cual se genera con las secciones anteriores y sirve para validar que el contenido no haya sido alterado.</li>
</ol>
<p>Ejemplo del Header</p>
<pre class="lang:js decode:true">{
  "alg": "HS256",
  "typ": "JWT"
}</pre>
<p>Ejemplo del Payload</p>
<pre class="lang:js decode:true ">{
  "id": "1234567890",
  "name": "Oscar Blancarte",
  "rol": “admin”
}</pre>
<p>La firma por otra parte es el header y el payload en base64 y después encriptado.</p>
<p>Puedes leer más de <a href="https://jwt.io/">JWT en su página oficial</a></p>
<h2>Como se utiliza los JWT</h2>
<p>Como ya hablamos, los JWT se utilizan para autenticar a los usuarios, para ello, el usuario requiere de un login tradicional como es el usuario y password. Una vez, que el sistema de Backend valida que el usuario y contraseña son correctos, este retorna un token al usuario. Este token lo deberá guardar el cliente, pues de aquí en adelante, todas las peticiones que realice al servidor, deberá llevar el token.</p>
<p><img loading="lazy" class="aligncenter wp-image-1734 " src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JWT-token.png" alt="JWT JSON Web Token" width="954" height="344" /></p>
<p>El token es por lo general almacenado en Cookies o en el LocalStorage del navegador, y cuando es requerido enviar un request al servidor, se recupere y se envía como header.</p>
<p>Un dato interesante del token es que no requiere que el servidor lo almacene para compararlos cuando lo envíe el cliente, pues el token por si solo puede ser auto validado, y como tiene un payload, es posible determinar de quien es el token. Veamos el siguiente payload:</p>
<pre class="lang:js decode:true ">{
  “userID”: 12345,
  “username”: “oblancarte”,
  “rol”: “admin”
}</pre>
<p>Cuando el servidor desencripte el token, podrá recuperar este payload y con ello, podrá saber que usuario es e incluso, es posible guardar datos adicionales como el rol o cualquier dato en formato JSON.</p>
<p>Otro dato interesante del token es que expira, es decir, el token solo es válido por un tiempo determinado. Por lo que el usuario deberá volverse a logear una vez que el token expire.</p>
<h2>Veamos cómo funcionaría todo el ciclo de vida de un JWT</h2>
<p>Ya hemos hablado de como JWT funciona, pero ahora entraremos a ver como es la interacción que tiene un usuario al autenticarse por medio de JWT, para lo cual veamos la siguiente imagen:</p>
<p><img loading="lazy" class="aligncenter wp-image-1735" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/06/JWT-lifecycle.png" alt="JWT JSON Web Token-lifecycle" width="917" height="407" /></p>
<p>Los pasos son los siguientes:</p>
<ol>
<li>El usuario requiere de una autenticación tradicional con el servidor, es decir usuario y password (o cualquier otro tipo de autenticación).</li>
<li>El servidor validará que los datos introducidos sean correctos y generará un Token.</li>
<li>El servidor enviará el token al usuario y este lo tendrá que almacenar de cualquier forma.</li>
<li>Una vez con el token, el usuario realiza una petición al servidor, enviando en el header el token previamente generado.</li>
<li>El servidor validará que el token sea correcto, desencriptandolo mediante la misma llave que utilizo para encriptarlo.</li>
<li>Si el token es correcto, entonces el servidor retornará los datos solicitados.</li>
</ol>
<p>Cabe mencionar que los puntos 4,5 y 6 se pueden repetir indeterminado número de veces hasta que el token caduque, cuando esto pase, entonces será necesario reiniciar desde el paso 1.</p>
<h2>Como implementar un JWT</h2>
<p>Existe una serie de librerías que nos permite crear un JWT, y todo dependerá del lenguaje que utilicemos. Sin embargo, quiero mostrarte como crear un JWT con <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a>.</p>
<p>Lo primero, es que será necesario importar el módulo <strong>jsonwebtoken:</strong></p>
<p><em>npm install –save jsonwebtoken</em></p>
<p><em> </em></p>
<h3>Generación del Token</h3>
<p>ya con la dependencia instalada podemos crear el token de la siguiente manera:</p>
<pre class="lang:js decode:true ">var jwt = require('jsonwebtoken')

function generateToken(user) {
  var u = {
   username: user.username,
   id: user.id
  }
  return token = jwt.sign(u, ‘password’, {
     expiresIn: 60 * 60 * 24 // expires in 24 hours
  })
}</pre>
<p>Lo primero que haremos será crear una función que reciba el objeto usuario o cualquier otro objeto que contenga la información requerida para la autenticación. Luego mediante el objeto usuario, creamos el objeto u, el cual solo contiene el username y el ID del usuario. Este objeto se convertirá en el payload del JWT, es decir la segunda parte del token.</p>
<p>Seguido, procedemos a crear el token mediante el módulo jwt, el cual nos proporciona el método sign que recibirá el payload y un password, este password deberá ser secreto, pues con él, podremos crear y desencriptar los tokens. Finalmente, el tercer parámetro son las opciones, aquí podremos seleccionar el algoritmo de encriptación, la fecha de expiración, etc.  En este ejemplo dejamos la configuración por default, pero agregamos que el token sea válidos solo por 24 horas.</p>
<p>Finalmente, el token es retornado al cliente.</p>
<h3>Validación del token</h3>
<p>Hasta este punto solo hemos visto la parte de la generación del Token, pero falta la segunda parte, en donde tenemos que validar que el Token que el cliente nos manda, es válido.</p>
<p>Para validar el Token podemos utilizar un Middleware de Express que valide de forma automática todas las URL que inicien con <strong>/secure</strong>. El middleware se ve de la siguiente manera:</p>
<pre class="lang:js decode:true ">router.use('/secure',function(req, res, next) {
  var token = req.headers['authorization']
  if (!token) {
    res.status(401).send({
      ok: false,
      message: 'Toket inválido'
    })
  }

  token = token.replace('Bearer ', '')

  jwt.verify(token, ‘password’, function(err, token) {
    if (err) {
      return res.status(401).send({
        ok: false,
        message: 'Toket inválido'
      });
    } else {
      req.token = token
      next()
    }
  });
});</pre>
<p>Podemos ver que en la primera llínea inicializa el middleware, luego en la segunda línea obtenemos el token del header <strong>“</strong><strong>authorization”</strong>. Si el token es Null regresamos un 401 indicando que no el cliente no tiene privilegios.</p>
<p>Los token generados por JWT se crean con la palabra “Bearer” al inicio del token, por lo que en la línea 10 quitamos esa parte del token, seguido, en la línea 12 realizamos la validación del token mediante el método verify.</p>
<p>Este método recibe el token como primer parámetro, como segundo parámetro, mandamos el password para desencriptar el token. Finalmente se envía como tercer parámetro una función Callback una vez que el token sea validado.</p>
<p>Si todo salió bien, el token estará en la variable token, en caso contrario, tendremos el error en la variable err.</p>
<h2>Conclusiones</h2>
<p>Como pudimos ver, los tokens son una magnifica forma de administrar la autenticación de los usuarios, pues permite crear de forma fácil, un mecanismo para comunicarse de forma segura entre el cliente y el servidor, además, de que permite mantener autenticado a un usuario por un tiempo determinado, evitando tener que iniciar sesión cada vez que entre a nuestra aplicación.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/">Autenticación con JSON Web Tokens</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/feed/</wfw:commentRss>
			<slash:comments>70</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1732</post-id>	</item>
	</channel>
</rss>
