{"id":95629,"date":"2022-07-31T11:09:58","date_gmt":"2022-07-31T09:09:58","guid":{"rendered":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/"},"modified":"2020-12-05T02:27:11","modified_gmt":"2020-12-05T05:27:11","slug":"conceptos-basicos-de-la-programacion-asincrona","status":"publish","type":"post","link":"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/","title":{"rendered":"Asynchronous Programming Basics"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contenidos<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#La-asincronia\" >La asincron\u00eda<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#Tecnologia-Crow\" >Tecnolog\u00eda Crow<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#Callbacks\" >Callbacks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#Promesas\" >Promesas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#Fracaso\" >Fracaso<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<div itemprop=\"articleBody\">\n<p>La parte central de un ordenador, o sea, la parte que lleva a cabo los pasos individuales que componen nuestros programas, se llama <em>procesador.<\/em> Los programas que hemos visto hasta ahora son cosas que mantendr\u00e1n ocupado al <em>procesador<\/em> hasta que hayan terminado su trabajo. La velocidad a la que se puede ejecutar algo como un bucle que manipula los n\u00fameros depende en gran medida de la velocidad del procesador.<\/p>\n<p>Pero muchos programas interact\u00faan con cosas externas al procesador. Por ejemplo, pueden comunicarse a trav\u00e9s de una red de computadoras o solicitar datos del disco duro, lo cual es mucho m\u00e1s lento que obtenerlos de la memoria.<\/p>\n<p>Cuando algo as\u00ed est\u00e1 sucediendo, ser\u00eda una l\u00e1stima dejar al procesador inactivo, ya que podr\u00eda haber alg\u00fan otro trabajo que hacer mientras tanto. En parte, esto es manejado por tu sistema operativo, que cambiar\u00e1 el procesador entre m\u00faltiples programas en ejecuci\u00f3n. Pero eso no ayuda cuando queremos que un solo programa pueda progresar mientras espera una petici\u00f3n de red.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"La-asincronia\"><\/span>La asincron\u00eda<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>En un modelo de programaci\u00f3n sincr\u00f3nica, las cosas suceden una a la vez. Cuando se llama a una funci\u00f3n que realiza una acci\u00f3n de larga duraci\u00f3n, s\u00f3lo vuelve cuando la acci\u00f3n ha finalizado y puede devolver el resultado. Esto detiene el programa durante el tiempo que dure la acci\u00f3n.<\/p>\n<p>Un modelo asincr\u00f3nico permite que sucedan m\u00faltiples cosas al mismo tiempo. Al iniciar una acci\u00f3n, el programa contin\u00faa ejecut\u00e1ndose. Cuando la acci\u00f3n termina, el programa es informado y tiene acceso al resultado (por ejemplo, los datos le\u00eddos desde el disco).<\/p>\n<p>Podemos comparar la programaci\u00f3n s\u00edncrona y as\u00edncrona usando un peque\u00f1o ejemplo: un programa que obtiene dos recursos de la red y luego combina resultados.<\/p>\n<p>En un entorno sincr\u00f3nico, donde la funci\u00f3n de petici\u00f3n s\u00f3lo vuelve despu\u00e9s de haber hecho su trabajo, la forma m\u00e1s f\u00e1cil de realizar esta tarea es hacer las peticiones una tras otra. Esto tiene el inconveniente de que la segunda solicitud se iniciar\u00e1 s\u00f3lo cuando la primera haya terminado. El tiempo total necesario ser\u00e1 como m\u00ednimo la suma de los dos tiempos de respuesta.<\/p>\n<p>La soluci\u00f3n a este problema, en un sistema s\u00edncrono, es poner en marcha hilos de control adicionales. Un hilo es otro programa en ejecuci\u00f3n cuya ejecuci\u00f3n puede ser entrelazada con otros programas por el sistema operativo; ya que la mayor\u00eda de los ordenadores modernos contienen m\u00faltiples procesadores, m\u00faltiples hilos pueden incluso ejecutarse al mismo tiempo, en diferentes procesadores. Un segundo hilo podr\u00eda iniciar la segunda petici\u00f3n, y luego ambos hilos esperan a que sus resultados vuelvan, despu\u00e9s de lo cual se re-sincronizan para combinar sus resultados.<\/p>\n<p>En el modelo sincr\u00f3nico, el tiempo que toma la red es parte de la l\u00ednea de tiempo para un hilo de control dado. En el modelo as\u00edncrono, el inicio de una acci\u00f3n de red causa conceptualmente una divisi\u00f3n en la l\u00ednea de tiempo. El programa que inici\u00f3 la acci\u00f3n contin\u00faa ejecut\u00e1ndose, y la acci\u00f3n ocurre junto a \u00e9l, notificando al programa cuando finaliza.<\/p>\n<p>Otra forma de describir la diferencia es que esperar a que las acciones terminen est\u00e1 impl\u00edcito en el modelo s\u00edncrono, mientras que es expl\u00edcito, bajo nuestro control, en el as\u00edncrono.<\/p>\n<p>La asincron\u00eda corta en ambos sentidos. Facilita la expresi\u00f3n de programas que no encajan en el modelo de control de l\u00ednea recta, pero tambi\u00e9n puede hacer que los programas de expresi\u00f3n que siguen una l\u00ednea recta sean m\u00e1s inc\u00f3modos. Veremos algunas maneras de abordar esta incomodidad m\u00e1s adelante en este cap\u00edtulo.<\/p>\n<p>Las dos importantes plataformas de programaci\u00f3n JavaScript (navegadores y Node.js) realizan operaciones que pueden tardar un tiempo en ser asincr\u00f3nicas, en lugar de depender de sub-procesos. Dado que la programaci\u00f3n con hilos es notoriamente dif\u00edcil (entender lo que hace un programa es mucho m\u00e1s dif\u00edcil cuando est\u00e1 haciendo m\u00faltiples cosas a la vez), esto generalmente se considera algo bueno.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Tecnologia-Crow\"><\/span>Tecnolog\u00eda Crow<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>La mayor\u00eda de la gente es consciente del hecho de que los cuervos son aves muy inteligentes. Pueden usar herramientas, planear con anticipaci\u00f3n, recordar cosas e incluso comunicarlas entre ellos.<\/p>\n<p>Lo que la mayor\u00eda de la gente no sabe es que son capaces de muchas cosas que mantienen bien ocultas de nosotros. Un reputado (aunque un tanto exc\u00e9ntrico) experto en c\u00f3rvidos me ha dicho que la tecnolog\u00eda de los cuervos no est\u00e1 muy por debajo de la tecnolog\u00eda humana, y que se est\u00e1n poniendo al d\u00eda.<\/p>\n<p>Por ejemplo, muchas culturas de cuervos tienen la capacidad de construir dispositivos inform\u00e1ticos. Estos no son electr\u00f3nicos, como lo son los dispositivos inform\u00e1ticos humanos, sino que operan a trav\u00e9s de las acciones de peque\u00f1os insectos, una especie estrechamente relacionada con la termita, que ha desarrollado una relaci\u00f3n simbi\u00f3tica con los cuervos. Las aves les proporcionan alimento, y a cambio los insectos construyen y operan sus complejas colonias que, con la ayuda de los seres vivos que hay en su interior, realizan c\u00e1lculos.<\/p>\n<p>Estas colonias suelen estar ubicadas en nidos grandes y longevos. Las aves y los insectos trabajan juntos para construir una red de estructuras de arcilla bulbosa, escondidas entre las ramitas del nido, en las que los insectos viven y trabajan.<\/p>\n<p>Para comunicarse con otros dispositivos, estas m\u00e1quinas utilizan se\u00f1ales luminosas. Los cuervos incrustan piezas de material reflectante en tallos especiales de comunicaci\u00f3n, y los insectos las dirigen para reflejar la luz en otro nido, codificando los datos como una secuencia de destellos r\u00e1pidos. Esto significa que s\u00f3lo los nidos que tienen una conexi\u00f3n visual ininterrumpida pueden comunicarse.<\/p>\n<p>Nuestro amigo el experto en c\u00f3rvidos ha cartografiado la red de nidos de cuervo en el pueblo de <em>Hi\u00e8res-sur-Amby,<\/em> a orillas del r\u00edo R\u00f3dano.<\/p>\n<p>En un asombroso ejemplo de evoluci\u00f3n convergente, las computadoras de cuervo ejecutan JavaScript. En este cap\u00edtulo escribiremos algunas funciones de red b\u00e1sicas para ellos.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Callbacks\"><\/span>Callbacks<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Un enfoque de la programaci\u00f3n as\u00edncrona es hacer que las funciones que realizan una acci\u00f3n lenta tomen un argumento extra, una funci\u00f3n de callback. La acci\u00f3n se inicia, y cuando finaliza, se llama a la funci\u00f3n de callback con el resultado.<\/p>\n<p>Por ejemplo, la funci\u00f3n <strong>setTimeout,<\/strong> disponible tanto en <strong>Node.js<\/strong> como en los <strong>navegadores,<\/strong> espera un n\u00famero determinado de milisegundos (un segundo es mil milisegundos) y luego llama a una funci\u00f3n.<\/p>\n<p><code>setTimeout(() =&gt; console.log(\"Tick\"), 500);<\/code><\/p>\n<p>Por lo general, la espera no es un tipo de trabajo muy importante, pero puede ser \u00fatil cuando se hace algo como actualizar una animaci\u00f3n o comprobar si algo est\u00e1 llevando m\u00e1s tiempo que una cantidad de tiempo determinada.<\/p>\n<p>Realizar varias acciones as\u00edncronas en una fila utilizando la funci\u00f3n de callback significa que tiene que seguir pasando nuevas funciones para manejar la continuaci\u00f3n del c\u00e1lculo despu\u00e9s de las acciones.<\/p>\n<p>La mayor\u00eda de las computadoras de <em>nido de cuervo<\/em> tienen una bombilla de almacenamiento de datos a largo plazo, donde las piezas de informaci\u00f3n se graban en ramitas para que puedan ser recuperadas m\u00e1s tarde. El grabado, o la b\u00fasqueda de un dato, lleva un momento, por lo que la interfaz para el almacenamiento a largo plazo es as\u00edncrona y utiliza funciones de callback.<\/p>\n<p>Las bombillas de almacenamiento almacenan los datos codificados por JSON bajo nombres. Un cuervo puede almacenar informaci\u00f3n sobre los lugares donde se esconde la comida bajo el nombre de \u00abcach\u00e9s de comida\u00bb, que puede contener una serie de nombres que apuntan a otras piezas de datos, describiendo la cach\u00e9 real. Para buscar un cach\u00e9 de comida en los bulbos de almacenamiento del nido de roble grande, un cuervo podr\u00eda ejecutar un c\u00f3digo como este:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nimport {bigOak} from \".\/crow-tech\";&#13;\n&#13;\nbigOak.readStorage(\"food caches\", caches =&gt; {&#13;\nlet firstCache = caches[0];&#13;\nbigOak.readStorage(firstCache, info =&gt; {&#13;\nconsole.log(info);&#13;\n});&#13;\n});&#13;\n<\/pre>\n<p>(Todos los nombres y cadenas de caracteres han sido traducidos del idioma crow al ingl\u00e9s.<\/p>\n<p>Este estilo de programaci\u00f3n es factible, pero el nivel de indentaci\u00f3n aumenta con cada acci\u00f3n as\u00edncrona porque se termina en otra funci\u00f3n. Hacer cosas m\u00e1s complicadas, como ejecutar varias acciones al mismo tiempo, puede resultar un poco inc\u00f3modo.<\/p>\n<p>Las computadoras de nido de cuervo est\u00e1n construidas para comunicarse usando pares de solicitud-respuesta. Esto significa que un nido env\u00eda un mensaje a otro nido, el cual inmediatamente env\u00eda un mensaje de vuelta, confirmando la recepci\u00f3n y posiblemente incluyendo una respuesta a una pregunta formulada en el mensaje.<\/p>\n<p>Cada mensaje se etiqueta con un tipo, que determina c\u00f3mo se maneja. Nuestro c\u00f3digo puede definir manejadores para tipos espec\u00edficos de peticiones, y cuando se recibe una solicitud de este tipo, el manejador es llamado para producir una respuesta.<\/p>\n<p>La interfaz exportada por el m\u00f3dulo <strong>\u00ab.\/crow-tech\u00bb<\/strong> proporciona funciones basadas en la callback para la comunicaci\u00f3n. Los nidos tienen un m\u00e9todo de env\u00edo que env\u00eda una petici\u00f3n. Espera el nombre del nido de destino, el tipo de solicitud y el contenido de la solicitud como sus tres primeros argumentos, y espera que una funci\u00f3n llame cuando se reciba una respuesta como su cuarto y \u00faltimo argumento.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nbigOak.send(\"Cow Pasture\", \"note\", \"Let's caw loudly at 7PM\",&#13;\n() =&gt; console.log(\"Note delivered.\"));&#13;\n<\/pre>\n<p>Pero para hacer nidos capaces de recibir esa petici\u00f3n, primero tenemos que definir un tipo de petici\u00f3n llamado \u00abnota\u00bb. El c\u00f3digo que maneja las peticiones tiene que ejecutarse no s\u00f3lo en este nido-computadora sino en todos los nidos que puedan recibir mensajes de este tipo. Asumiremos que un cuervo vuela e instala nuestro c\u00f3digo en todos los nidos.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nimport {defineRequestType} from \".\/crow-tech\";&#13;\n&#13;\ndefineRequestType(\"note\", (nest, content, source, done) =&gt; {&#13;\nconsole.log(`${nest.name} received note: ${content}`);&#13;\ndone();&#13;\n});&#13;\n<\/pre>\n<p>La funci\u00f3n <strong>defineRequestType<\/strong> define un nuevo tipo de solicitud. El ejemplo a\u00f1ade soporte para peticiones de \u00abnota\u00bb, que simplemente env\u00eda una nota a un nido dado. Nuestra implementaci\u00f3n llama a <strong>console.log<\/strong> para que podamos verificar que la solicitud lleg\u00f3. Los nidos tienen una propiedad con un nombre que contiene su nombre.<\/p>\n<p>El cuarto argumento dado al handler, done, es una funci\u00f3n de callback a la que debe llamar cuando termina la petici\u00f3n. Si hubi\u00e9ramos utilizado el valor de retorno del controlador como valor de respuesta, esto significar\u00eda que un controlador de peticiones no puede realizar acciones as\u00edncronas. Una funci\u00f3n que realiza trabajo as\u00edncrono normalmente vuelve antes de que el trabajo est\u00e9 terminado, habiendo dispuesto que se llame a una callback cuando se complete. As\u00ed que necesitamos alg\u00fan mecanismo as\u00edncrono (en este caso, otra funci\u00f3n de callback) para se\u00f1alar cuando hay una respuesta disponible.<\/p>\n<p>En cierto modo, la asincron\u00eda es contagiosa. Cualquier funci\u00f3n que llame a una funci\u00f3n que trabaje asincr\u00f3nicamente debe ser asincr\u00f3nica, utilizando un mecanismo de callback o similar para entregar su resultado. Llamar a una callback es algo m\u00e1s complicado y propenso a errores que simplemente devolver un valor, por lo que no es bueno tener que estructurar grandes partes de su programa de esa manera.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Promesas\"><\/span>Promesas<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Trabajar con conceptos abstractos es a menudo m\u00e1s f\u00e1cil cuando esos conceptos pueden ser representados por valores. En el caso de acciones asincr\u00f3nicas, en lugar de organizar la llamada de una funci\u00f3n en alg\u00fan momento futuro, se puede devolver un objeto que represente este evento futuro.<\/p>\n<p>Para esto es la clase est\u00e1ndar de Promesa. Una promesa es una acci\u00f3n asincr\u00f3nica que puede completarse en alg\u00fan momento y producir un valor. Es capaz de notificar a cualquier persona que est\u00e9 interesada cuando su valor est\u00e9 disponible.<\/p>\n<p>La manera m\u00e1s f\u00e1cil de crear una promesa es llamando a <strong>Promise.resolve.<\/strong> Esta funci\u00f3n asegura que el valor que se le da est\u00e9 envuelto en una promesa. Si ya es una promesa, simplemente se devuelve; de lo contrario, se obtiene una nueva promesa que inmediatamente termina con su valor como resultado.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nlet fifteen = Promise.resolve(15);&#13;\nfifteen.then(value =&gt; console.log(`Got ${value}`));&#13;\n\/\/ \u2192 Got 15&#13;\n<\/pre>\n<p>Para obtener el resultado de una promesa, puedes usar su m\u00e9todo de entonces. Esto registra una funci\u00f3n de callback para ser llamada cuando la promesa se resuelve y produce un valor. Puede agregar varias\u00a0callbacks a una sola promesa, y ser\u00e1n llamadas, incluso si las agrega despu\u00e9s de que la promesa ya se haya resuelto (terminado).<\/p>\n<p>Pero eso no es todo lo que el m\u00e9todo hace entonces. Devuelve otra promesa, que resuelve el valor que la funci\u00f3n del controlador devuelve o, si eso devuelve una promesa, espera esa promesa y luego resuelve su resultado.<\/p>\n<p>Es \u00fatil pensar en las promesas como un dispositivo para trasladar los valores a una realidad asincr\u00f3nica. Un valor normal est\u00e1 simplemente ah\u00ed. Un valor prometido es un valor que puede que ya exista o que pueda aparecer en alg\u00fan momento en el futuro. Los c\u00e1lculos definidos en t\u00e9rminos de promesas act\u00faan sobre estos valores envueltos y se ejecutan asincr\u00f3nicamente a medida que los valores est\u00e1n disponibles.<\/p>\n<p>Para crear una promesa, puede utilizar Promise como constructor. Tiene una interfaz un tanto extra\u00f1a: el constructor espera una funci\u00f3n como argumento, que llama inmediatamente, pas\u00e1ndole una funci\u00f3n que puede usar para resolver la promesa. Funciona de esta manera, en lugar de, por ejemplo, con un m\u00e9todo de resoluci\u00f3n, de modo que s\u00f3lo el c\u00f3digo que cre\u00f3 la promesa puede resolverla.<\/p>\n<p>As\u00ed es como se crea una interfaz basada en promesas para la funci\u00f3n <strong>readStorage:<\/strong><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nfunction storage(nest, name) {&#13;\nreturn new Promise(resolve =&gt; {&#13;\nnest.readStorage(name, result =&gt; resolve(result));&#13;\n});&#13;\n}&#13;\n&#13;\nstorage(bigOak, \"enemies\")&#13;\n.then(value =&gt; console.log(\"Got\", value));&#13;\n<\/pre>\n<p>Esta funci\u00f3n as\u00edncrona devuelve un valor significativo. Esta es la principal ventaja de las promesas: simplifican el uso de funciones as\u00edncronas. En lugar de tener que pasar callback, las funciones basadas en promesas se ven similares a las normales: toman los datos como argumentos y devuelven sus resultados. La \u00fanica diferencia es que la salida puede no estar disponible todav\u00eda.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Fracaso\"><\/span>Fracaso<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Los c\u00e1lculos regulares de JavaScript pueden fallar si se hace una excepci\u00f3n. Los c\u00e1lculos as\u00edncronos a menudo necesitan algo as\u00ed. Una solicitud de red puede fallar, o alg\u00fan c\u00f3digo que forme parte del c\u00e1lculo as\u00edncrono puede ser una excepci\u00f3n.<\/p>\n<p>Uno de los problemas m\u00e1s apremiantes con el estilo de callback de la programaci\u00f3n as\u00edncrona es que hace que sea extremadamente dif\u00edcil asegurarse de que las fallas se informen adecuadamente a las callbacks.<\/p>\n<p>Una convenci\u00f3n ampliamente utilizada es que el primer argumento de la callback se utiliza para indicar que la acci\u00f3n fall\u00f3, y el segundo contiene el valor producido por la acci\u00f3n cuando fue exitosa. Estas funciones de callback siempre deben comprobar si recibieron una excepci\u00f3n y asegurarse de que cualquier problema que causen, incluidas las excepciones lanzadas por las funciones a las que llaman, sean detectadas y asignadas a la funci\u00f3n correcta.<\/p>\n<p>Las promesas lo hacen m\u00e1s f\u00e1cil. Pueden ser resueltos (la acci\u00f3n termin\u00f3 con \u00e9xito) o rechazados (fall\u00f3). Los manejadores de Resolve (como se registraron en ese entonces) son llamados s\u00f3lo cuando la acci\u00f3n es exitosa, y los rechazos son propagados autom\u00e1ticamente a la nueva promesa que es devuelta para entonces. Y cuando un handler lanza una excepci\u00f3n, autom\u00e1ticamente hace que la promesa producida por su llamada sea rechazada. As\u00ed que si cualquier elemento en una cadena de acciones as\u00edncronas falla, el resultado de toda la cadena se marca como rechazado, y no se llama a ning\u00fan manejador de \u00e9xito m\u00e1s all\u00e1 del punto en el que fall\u00f3.<\/p>\n<p>De la misma manera que resolver una promesa proporciona un valor, rechazar una tambi\u00e9n proporciona uno, usualmente llamado la raz\u00f3n del rechazo. Cuando una excepci\u00f3n en una funci\u00f3n de controlador causa el rechazo, se utiliza el valor de excepci\u00f3n como motivo. De manera similar, cuando un manejador devuelve una promesa que es rechazada, ese rechazo fluye hacia la siguiente promesa. Hay una funci\u00f3n <strong>Promise.reject<\/strong> que crea una nueva promesa, inmediatamente rechazada.<\/p>\n<p>Para manejar expl\u00edcitamente tales rechazos, las promesas tienen un m\u00e9todo de captura que registra a un manejador para que sea llamado cuando la promesa es rechazada, de manera similar a como los manejadores manejan la resoluci\u00f3n normal. Tambi\u00e9n es muy parecido a eso en el sentido de que devuelve una nueva promesa, que se resuelve al valor de la promesa original si se resuelve normalmente y al resultado del manipulador de la captura en caso contrario. Si un gestor de capturas tira un error, tambi\u00e9n se rechaza la nueva promesa.<\/p>\n<p>Como abreviatura, tambi\u00e9n acepta un manejador de rechazo como segundo argumento, por lo que puede instalar ambos tipos de manejadores en una sola llamada a un m\u00e9todo.<\/p>\n<p>Una funci\u00f3n pasada al constructor de la Promesa recibe un segundo argumento, junto con la funci\u00f3n de resoluci\u00f3n, que puede utilizar para rechazar la nueva promesa.<\/p>\n<p>Las cadenas de valores de promesa creadas por las llamadas a ese momento y la captura pueden ser vistas como una tuber\u00eda a trav\u00e9s de la cual se mueven valores asincr\u00f3nicos o fallas. Puesto que estas cadenas se crean registrando a los manejadores, cada eslab\u00f3n tiene un manejador de \u00e9xito o un manejador de rechazo (o ambos) asociados con \u00e9l. Los manejadores que no coinciden con el tipo de resultado (\u00e9xito o fracaso) son ignorados. Pero los que s\u00ed coinciden son llamados, y su resultado determina qu\u00e9 tipo de valor viene despu\u00e9s: el \u00e9xito cuando devuelve un valor sin promesa, el rechazo cuando lanza una excepci\u00f3n, y el resultado de una promesa cuando devuelve uno de esos.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nnew Promise((_, reject) =&gt; reject(new Error(\"Fail\")))&#13;\n.then(value =&gt; console.log(\"Handler 1\"))&#13;\n.catch(reason =&gt; {&#13;\nconsole.log(\"Caught failure \" + reason);&#13;\nreturn \"nothing\";&#13;\n})&#13;\n.then(value =&gt; console.log(\"Handler 2\", value));&#13;\n\/\/ \u2192 Caught failure Error: Fail&#13;\n\/\/ \u2192 Handler 2 nothing&#13;\n<\/pre>\n<p>Al igual que una excepci\u00f3n no capturada es manejada por el entorno, los entornos JavaScript pueden detectar cuando no se maneja un rechazo de promesa y lo reportar\u00e1n como un error.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>La parte central de un ordenador, o sea, la parte que lleva a cabo los pasos individuales que componen nuestros programas, se llama procesador. Los programas que hemos visto hasta&#8230;<\/p>","protected":false},"author":1,"featured_media":95630,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1374],"tags":[],"class_list":["post-95629","post","type-post","status-publish","format-standard","has-post-thumbnail","category-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.0 (Yoast SEO v28.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona - R Marketing Digital<\/title>\n<meta name=\"description\" content=\"La parte central de un ordenador, o sea, la parte que lleva a cabo los pasos individuales que componen nuestros programas, se llama procesador. Los\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona\" \/>\n<meta property=\"og:description\" content=\"La parte central de un ordenador, o sea, la parte que lleva a cabo los pasos individuales que componen nuestros programas, se llama procesador. Los\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/\" \/>\n<meta property=\"og:site_name\" content=\"R Marketing Digital\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-31T09:09:58+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/asincrono2-2838793.png\" \/>\n\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t<meta property=\"og:image:height\" content=\"200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"R Marketing Digital\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/\"},\"author\":{\"name\":\"R Marketing Digital\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\"},\"headline\":\"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona\",\"datePublished\":\"2022-07-31T09:09:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/\"},\"wordCount\":3036,\"image\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/asincrono2-2838793.png\",\"articleSection\":[\"Javascript\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/\",\"name\":\"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona - R Marketing Digital\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/asincrono2-2838793.png\",\"datePublished\":\"2022-07-31T09:09:58+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\"},\"description\":\"La parte central de un ordenador, o sea, la parte que lleva a cabo los pasos individuales que componen nuestros programas, se llama procesador. Los\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/conceptos-basicos-de-la-programacion-asincrona\\\/#primaryimage\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/asincrono2-2838793.png\",\"contentUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/asincrono2-2838793.png\",\"width\":350,\"height\":200,\"caption\":\"asincrono2-2838793-5937115-png\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#website\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/\",\"name\":\"R Marketing Digital\",\"description\":\"Agencia SEO | Publicidad redes sociales | Community Management\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rmarketingdigital.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\",\"name\":\"R Marketing Digital\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g\",\"caption\":\"R Marketing Digital\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona - R Marketing Digital","description":"The central part of a computer, that is, the part that carries out the individual steps that make up our programs, is called the processor. The","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/","og_locale":"en_US","og_type":"article","og_title":"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona","og_description":"La parte central de un ordenador, o sea, la parte que lleva a cabo los pasos individuales que componen nuestros programas, se llama procesador. Los","og_url":"https:\/\/rmarketingdigital.com\/en\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/","og_site_name":"R Marketing Digital","article_published_time":"2022-07-31T09:09:58+00:00","og_image":[{"width":350,"height":200,"url":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/asincrono2-2838793.png","type":"image\/png"}],"author":"R Marketing Digital","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#article","isPartOf":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/"},"author":{"name":"R Marketing Digital","@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e"},"headline":"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona","datePublished":"2022-07-31T09:09:58+00:00","mainEntityOfPage":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/"},"wordCount":3036,"image":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#primaryimage"},"thumbnailUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/asincrono2-2838793.png","articleSection":["Javascript"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/","url":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/","name":"Conceptos b\u00e1sicos de la programaci\u00f3n as\u00edncrona - R Marketing Digital","isPartOf":{"@id":"https:\/\/rmarketingdigital.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#primaryimage"},"image":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#primaryimage"},"thumbnailUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/asincrono2-2838793.png","datePublished":"2022-07-31T09:09:58+00:00","author":{"@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e"},"description":"The central part of a computer, that is, the part that carries out the individual steps that make up our programs, is called the processor. The","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rmarketingdigital.com\/javascript\/conceptos-basicos-de-la-programacion-asincrona\/#primaryimage","url":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/asincrono2-2838793.png","contentUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/asincrono2-2838793.png","width":350,"height":200,"caption":"asincrono2-2838793-5937115-png"},{"@type":"WebSite","@id":"https:\/\/rmarketingdigital.com\/#website","url":"https:\/\/rmarketingdigital.com\/","name":"R Digital Marketing","description":"SEO Agency | Advertising social networks | Community Management","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rmarketingdigital.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e","name":"R Digital Marketing","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g","caption":"R Marketing Digital"}}]}},"_links":{"self":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts\/95629","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/comments?post=95629"}],"version-history":[{"count":0,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts\/95629\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/media\/95630"}],"wp:attachment":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/media?parent=95629"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/categories?post=95629"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/tags?post=95629"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}