{"id":620,"date":"2019-02-02T13:04:32","date_gmt":"2019-02-02T20:04:32","guid":{"rendered":"https:\/\/rosolutions.com.mx\/blog\/?p=620"},"modified":"2019-02-02T13:04:32","modified_gmt":"2019-02-02T20:04:32","slug":"promesas-en-js","status":"publish","type":"post","link":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/","title":{"rendered":"Promesas en JS"},"content":{"rendered":"<h1><strong>\u00bfQu\u00e9 es una promesa?<\/strong><\/h1>\n<p>En JavaScript, una <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Promise\"><strong>promesa<\/strong><\/a> es un objeto que representa el resultado eventual de una operaci\u00f3n as\u00edncrona. En palabras simples, una promesa es una acci\u00f3n que puede ser completada (resolve), o negada (reject). Este tipo de objeto se introdujo en la especificaci\u00f3n ECMAScript 6 (ES6\/ES2015).<\/p>\n<p>Estas promesas tienen 3 estados:<\/p>\n<ul>\n<li><strong>Pending<\/strong> \u2013 La operaci\u00f3n as\u00edncrona a\u00fan no est\u00e1 completada<\/li>\n<li><strong>Fulfilled<\/strong> \u2013 La operaci\u00f3n termin\u00f3 y la promesa puede tener un resultado.<\/li>\n<li><strong>Rejected <\/strong>\u2013 La operaci\u00f3n termin\u00f3 con un error.<\/li>\n<\/ul>\n<p>A continuaci\u00f3n se muestra como luce una promesa simple:<\/p>\n<pre class=\"javascript\" style=\"background-color: #eee;font-family: monospace\"><span style=\"color: #000066;font-weight: bold\">const<\/span> goodPromise <span style=\"color: #339933\">=<\/span> <span style=\"color: #000066;font-weight: bold\">new<\/span> Promise<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span>resolve<span style=\"color: #339933\">,<\/span> reject<span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n    resolve<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'promise resolved!'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\ngoodPromise.<span style=\"color: #660066\">then<\/span><span style=\"color: #009900\">(<\/span>result <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>result<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>En el ejemplo de arriba, primero creamos una variable inmutable llamada <strong>goodPromise<\/strong> que contendr\u00e1 nuestra nueva promesa. Dentro de ella le decimos que env\u00ede como respuesta un String cada que sea resuelta. M\u00e1s abajo ejecutamos nuestra promesa con el m\u00e9todo\u00a0<strong>then()<\/strong>, que nos entrega como resultado el String que ingresamos.<\/p>\n<p>Una promesa no siempre entregar\u00e1 un resultado positivo, por ello tambi\u00e9n cuentan con un m\u00e9todo llamado\u00a0<strong>catch()<\/strong>, el cual tiene como funci\u00f3n &#8220;cachar&#8221; cualquier error o rechazo que suceda durante el proceso de ejecuci\u00f3n.<\/p>\n<pre class=\"javascript\" style=\"background-color: #eee;font-family: monospace\"><span style=\"color: #000066;font-weight: bold\">const<\/span> badPromise <span style=\"color: #339933\">=<\/span> <span style=\"color: #000066;font-weight: bold\">new<\/span> Promise<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span>resolve<span style=\"color: #339933\">,<\/span> reject<span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n    reject<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'promise rejected...'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\nbadPromise\r\n    .<span style=\"color: #660066\">then<\/span><span style=\"color: #009900\">(<\/span>result <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>result<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #000066;font-weight: bold\">catch<\/span><span style=\"color: #009900\">(<\/span>error <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>\u00a1Bien! Ahora que sabemos que es una <strong>promesa <\/strong>y como funciona, veamos algunos de sus otros m\u00e9todos, que son\u00a0<strong>race()<\/strong>,\u00a0<strong>all()<\/strong>, y\u00a0<strong>finally()<\/strong>.<\/p>\n<pre class=\"javascript\" style=\"background-color: #eee;font-family: monospace\"><span style=\"color: #000066;font-weight: bold\">const<\/span> goodPromise <span style=\"color: #339933\">=<\/span> <span style=\"color: #000066;font-weight: bold\">new<\/span> Promise<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span>resolve<span style=\"color: #339933\">,<\/span> reject<span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n    resolve<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'promise resolved!'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\n<span style=\"color: #000066;font-weight: bold\">const<\/span> badPromise <span style=\"color: #339933\">=<\/span> <span style=\"color: #000066;font-weight: bold\">new<\/span> Promise<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span>resolve<span style=\"color: #339933\">,<\/span> reject<span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n    reject<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'promise rejected...'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\n<span style=\"color: #000066;font-weight: bold\">const<\/span> promises <span style=\"color: #339933\">=<\/span> <span style=\"color: #009900\">[<\/span>goodPromise<span style=\"color: #339933\">,<\/span> goodPromise<span style=\"color: #339933\">,<\/span> goodPromise<span style=\"color: #009900\">]<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\nPromise.<span style=\"color: #660066\">race<\/span><span style=\"color: #009900\">(<\/span>promises<span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #660066\">then<\/span><span style=\"color: #009900\">(<\/span>result <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>result<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #000066;font-weight: bold\">catch<\/span><span style=\"color: #009900\">(<\/span>error <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">error<\/span><span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #000066;font-weight: bold\">finally<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'Promise race is done!'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\nPromise.<span style=\"color: #660066\">all<\/span><span style=\"color: #009900\">(<\/span>promises<span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #660066\">then<\/span><span style=\"color: #009900\">(<\/span>result <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>result<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #000066;font-weight: bold\">catch<\/span><span style=\"color: #009900\">(<\/span>error <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">error<\/span><span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span>\r\n    .<span style=\"color: #000066;font-weight: bold\">finally<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'Promise all is done!'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>El m\u00e9todo\u00a0<strong>race()\u00a0<\/strong>nos regresa una promesa que se resuelve o se &#8220;cacha&#8221; tan pronto como una de las promesas en el iterable nos entregue un resultado o error,\u00a0<strong>all()\u00a0<\/strong>nos regresa una promesa que se resuelve cuando todas las promesas en el iterable pasaron, en caso de haber un error se &#8220;cacha&#8221; la promesa que entrega este mismo.<\/p>\n<p>El m\u00e9todo\u00a0<strong>finally()<\/strong> es nuevo, viene bajo la especificaci\u00f3n m\u00e1s reciente (ES2018), en este podemos ejecutar alg\u00fan pedazo de c\u00f3digo en una funci\u00f3n sin argumento en caso de que la promesa haya sido\u00a0<strong><em>fulfilled\u00a0<\/em><\/strong>o\u00a0<strong><em>rejected<\/em><\/strong>.<\/p>\n<p>Tambi\u00e9n existe\u00a0<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Statements\/async_function\"><strong>async\/await<\/strong><\/a>. No hay que asustarnos por este tipo de declaraci\u00f3n, son solo funciones que trabajan de manera as\u00edncrona a trav\u00e9s del\u00a0<a href=\"https:\/\/youtu.be\/8aGhZQkoFbQ\"><em><strong>event loop<\/strong><\/em><\/a>, que nos regresan promesas como respuesta.<\/p>\n<p>Yo, en lo personal, prefiero trabajar con <strong>async\/await<\/strong>, porqu\u00e9:<\/p>\n<ol>\n<li>La sintaxis y estructura usando este tipo de declaraci\u00f3n hace que tu c\u00f3digo sea m\u00e1s legible.<\/li>\n<li>Podemos manejar errores usando el cl\u00e1sico\u00a0<strong>try\/catch<\/strong>.<\/li>\n<li>El &#8220;debugging&#8221; es mucho m\u00e1s f\u00e1cil.<\/li>\n<\/ol>\n<pre class=\"javascript\" style=\"background-color: #eee;font-family: monospace\"><span style=\"color: #000066;font-weight: bold\">const<\/span> request <span style=\"color: #339933\">=<\/span> require<span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'request'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\n<span style=\"color: #000066;font-weight: bold\">const<\/span> uri <span style=\"color: #339933\">=<\/span> <span style=\"color: #3366cc\">'https:\/\/randomuser.me\/api\/?results=5'<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\n<span style=\"color: #000066;font-weight: bold\">const<\/span> promiseGet <span style=\"color: #339933\">=<\/span> <span style=\"color: #009900\">(<\/span>uri <span style=\"color: #339933\">=<\/span> <span style=\"color: #3366cc\">''<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span>\r\n    <span style=\"color: #000066;font-weight: bold\">new<\/span> Promise<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span>resolve<span style=\"color: #339933\">,<\/span> reject<span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n        request.<span style=\"color: #000066;font-weight: bold\">get<\/span><span style=\"color: #009900\">(<\/span>uri<span style=\"color: #339933\">,<\/span> <span style=\"color: #009900\">(<\/span>error<span style=\"color: #339933\">,<\/span> response<span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n            <span style=\"color: #000066;font-weight: bold\">if<\/span> <span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span>\r\n                <span style=\"color: #000066;font-weight: bold\">return<\/span> reject<span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n            <span style=\"color: #009900\">}<\/span>\r\n            resolve<span style=\"color: #009900\">(<\/span>response<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n        <span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n    <span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\n<span style=\"color: #000066;font-weight: bold\">const<\/span> asyncFunc <span style=\"color: #339933\">=<\/span> async <span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> <span style=\"color: #009900\">{<\/span>\r\n    <span style=\"color: #000066;font-weight: bold\">try<\/span> <span style=\"color: #009900\">{<\/span>\r\n        <span style=\"color: #000066;font-weight: bold\">const<\/span> pendingPromise <span style=\"color: #339933\">=<\/span> promiseGet<span style=\"color: #009900\">(<\/span>uri<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n        console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>pendingPromise<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\n        <span style=\"color: #000066;font-weight: bold\">const<\/span> <span style=\"color: #009900\">{<\/span> body <span style=\"color: #009900\">}<\/span> <span style=\"color: #339933\">=<\/span> await pendingPromise<span style=\"color: #339933\">;<\/span>\r\n        console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>JSON.<span style=\"color: #660066\">parse<\/span><span style=\"color: #009900\">(<\/span>body<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n    <span style=\"color: #009900\">}<\/span> <span style=\"color: #000066;font-weight: bold\">catch<\/span> <span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span>\r\n        console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span>error<span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n    <span style=\"color: #009900\">}<\/span>\r\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">;<\/span>\r\n\u00a0\r\nasyncFunc<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span>.<span style=\"color: #000066;font-weight: bold\">finally<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #339933\">=&gt;<\/span> console.<span style=\"color: #660066\">log<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #3366cc\">'async\/await is done!'<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span>\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>En este ejemplo instal\u00e9 el paquete\u00a0<a href=\"https:\/\/www.npmjs.com\/package\/request\"><strong>request<\/strong><\/a>, despu\u00e9s lo envolv\u00ed en una promesa. Despu\u00e9s declar\u00e9 una funci\u00f3n as\u00edncrona que ejecuta la promesa que cre\u00e9 anteriormente, esta promesa aun no est\u00e1 resuelta o rechazada as\u00ed que tenemos que esperar <strong>(await)<\/strong>. Cuando esta entrega una respuesta, la destructuro, y por \u00faltimo imprimo el objeto que me entrega.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Manejar promesas nos ayuda a manejar m\u00faltiples procesos sin necesidad de bloquear un proceso principal, y con la declaraci\u00f3n <strong>async\/await<\/strong> nuestro c\u00f3digo se vuelve un poco m\u00e1s legible, y usando algunas otras funciones del ES6 como la destructuraci\u00f3n, y m\u00e9todos como <strong>all()<\/strong> lo hacen a\u00fan m\u00e1s poderoso.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 es una promesa? En JavaScript, una promesa es un objeto que representa el resultado eventual de una operaci\u00f3n as\u00edncrona. En palabras simples, una promesa es una acci\u00f3n que puede ser completada (resolve), o negada (reject). Este tipo de objeto se introdujo en la especificaci\u00f3n ECMAScript 6 (ES6\/ES2015). Estas promesas tienen 3 estados: Pending \u2013 [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":623,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35,7],"tags":[],"class_list":["post-620","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo","category-desarrollo-de-software-a-la-medida"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Promesas en JS &#8212; Desarrollo de software<\/title>\n<meta name=\"description\" content=\"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Promesas en JS &#8212; Desarrollo de software\" \/>\n<meta property=\"og:description\" content=\"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Desarrollo de software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/rosolutionsmx\/\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-02T20:04:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png\" \/>\n\t<meta property=\"og:image:width\" content=\"785\" \/>\n\t<meta property=\"og:image:height\" content=\"340\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Saul Alejandro Meneses\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ROSolutionsmx\" \/>\n<meta name=\"twitter:site\" content=\"@ROSolutionsmx\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Saul Alejandro Meneses\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\"},\"author\":{\"name\":\"Saul Alejandro Meneses\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/7697657554cf053a122477c30abf3504\"},\"headline\":\"Promesas en JS\",\"datePublished\":\"2019-02-02T20:04:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\"},\"wordCount\":520,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png\",\"articleSection\":[\"Desarrollo\",\"Programaci\u00f3n\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\",\"name\":\"Promesas en JS &#8212; Desarrollo de software\",\"isPartOf\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png\",\"datePublished\":\"2019-02-02T20:04:32+00:00\",\"description\":\"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web.\",\"breadcrumb\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png\",\"contentUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png\",\"width\":785,\"height\":340,\"caption\":\"javascrip\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\/\/rosolutions.com.mx\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Promesas en JS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#website\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/\",\"name\":\"Desarrollo de software\",\"description\":\"Blog de RO Solutions\",\"publisher\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/rosolutions.com.mx\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#organization\",\"name\":\"RO Solutions\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png\",\"contentUrl\":\"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png\",\"width\":350,\"height\":346,\"caption\":\"RO Solutions\"},\"image\":{\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/rosolutionsmx\/\",\"https:\/\/x.com\/ROSolutionsmx\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/7697657554cf053a122477c30abf3504\",\"name\":\"Saul Alejandro Meneses\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7cd8031312d797524903f3d28ab113694c15f3eeca3188a84e097392844b71b6?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7cd8031312d797524903f3d28ab113694c15f3eeca3188a84e097392844b71b6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7cd8031312d797524903f3d28ab113694c15f3eeca3188a84e097392844b71b6?s=96&d=mm&r=g\",\"caption\":\"Saul Alejandro Meneses\"},\"sameAs\":[\"http:\/\/rosolutions.com.mx\"],\"url\":\"https:\/\/rosolutions.com.mx\/blog\/author\/saulmeneses\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Promesas en JS &#8212; Desarrollo de software","description":"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web.","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:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/","og_locale":"es_MX","og_type":"article","og_title":"Promesas en JS &#8212; Desarrollo de software","og_description":"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web.","og_url":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/","og_site_name":"Desarrollo de software","article_publisher":"https:\/\/www.facebook.com\/rosolutionsmx\/","article_published_time":"2019-02-02T20:04:32+00:00","og_image":[{"width":785,"height":340,"url":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png","type":"image\/png"}],"author":"Saul Alejandro Meneses","twitter_card":"summary_large_image","twitter_creator":"@ROSolutionsmx","twitter_site":"@ROSolutionsmx","twitter_misc":{"Escrito por":"Saul Alejandro Meneses","Tiempo de lectura":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#article","isPartOf":{"@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/"},"author":{"name":"Saul Alejandro Meneses","@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/7697657554cf053a122477c30abf3504"},"headline":"Promesas en JS","datePublished":"2019-02-02T20:04:32+00:00","mainEntityOfPage":{"@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/"},"wordCount":520,"commentCount":0,"publisher":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#organization"},"image":{"@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage"},"thumbnailUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png","articleSection":["Desarrollo","Programaci\u00f3n"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/","url":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/","name":"Promesas en JS &#8212; Desarrollo de software","isPartOf":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage"},"image":{"@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage"},"thumbnailUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png","datePublished":"2019-02-02T20:04:32+00:00","description":"Expertos en Desarrollo de Software, Aplicaci\u00f3nes M\u00f3viles, Sistemas Web, SEO, Marketing y Dise\u00f1o Web.","breadcrumb":{"@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#primaryimage","url":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png","contentUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2019\/02\/1_H-25KB7EbSHjv70HXrdl6w.png","width":785,"height":340,"caption":"javascrip"},{"@type":"BreadcrumbList","@id":"https:\/\/rosolutions.com.mx\/blog\/promesas-en-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Inicio","item":"https:\/\/rosolutions.com.mx\/blog\/"},{"@type":"ListItem","position":2,"name":"Promesas en JS"}]},{"@type":"WebSite","@id":"https:\/\/rosolutions.com.mx\/blog\/#website","url":"https:\/\/rosolutions.com.mx\/blog\/","name":"Desarrollo de software","description":"Blog de RO Solutions","publisher":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rosolutions.com.mx\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/rosolutions.com.mx\/blog\/#organization","name":"RO Solutions","url":"https:\/\/rosolutions.com.mx\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png","contentUrl":"https:\/\/rosolutions.com.mx\/blog\/wp-content\/uploads\/2018\/03\/icono-01-2.png","width":350,"height":346,"caption":"RO Solutions"},"image":{"@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/rosolutionsmx\/","https:\/\/x.com\/ROSolutionsmx"]},{"@type":"Person","@id":"https:\/\/rosolutions.com.mx\/blog\/#\/schema\/person\/7697657554cf053a122477c30abf3504","name":"Saul Alejandro Meneses","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/7cd8031312d797524903f3d28ab113694c15f3eeca3188a84e097392844b71b6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7cd8031312d797524903f3d28ab113694c15f3eeca3188a84e097392844b71b6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7cd8031312d797524903f3d28ab113694c15f3eeca3188a84e097392844b71b6?s=96&d=mm&r=g","caption":"Saul Alejandro Meneses"},"sameAs":["http:\/\/rosolutions.com.mx"],"url":"https:\/\/rosolutions.com.mx\/blog\/author\/saulmeneses\/"}]}},"_links":{"self":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts\/620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=620"}],"version-history":[{"count":20,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts\/620\/revisions"}],"predecessor-version":[{"id":642,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/posts\/620\/revisions\/642"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/media\/623"}],"wp:attachment":[{"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rosolutions.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}