{"id":95578,"date":"2022-08-23T16:38:09","date_gmt":"2022-08-23T14:38:09","guid":{"rendered":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/"},"modified":"2020-12-03T13:56:16","modified_gmt":"2020-12-03T16:56:16","slug":"funciones-asincronas","status":"publish","type":"post","link":"https:\/\/rmarketingdigital.com\/en\/javascript\/funciones-asincronas\/","title":{"rendered":"Asynchronous functions"},"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\">Contents<\/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\/funciones-asincronas\/#%C2%BFQue-cosa-son-las-funciones-de-callbacks\" >\u00bfQu\u00e9 cosa son las funciones de callbacks?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/funciones-asincronas\/#Te-prometo-que-hay-una-forma-mejor\" >Te prometo que hay una forma mejor<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/funciones-asincronas\/#aWait-for-it\" >(a)Wait for it<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<div itemprop=\"articleBody\">\n<p>Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras grandes, funciones de flecha, plantillas literales, etc.<\/p>\n<p><strong>Callbacks<\/strong> es uno de los conceptos m\u00e1s usados de javascript funcional moderno y si alguna vez has usado <strong>jQuery,<\/strong> es probable que ya hayas usado <strong>callbacks<\/strong> sin siquiera saberlo.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%C2%BFQue-cosa-son-las-funciones-de-callbacks\"><\/span>\u00bfQu\u00e9 cosa son las funciones de callbacks?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A <strong>funci\u00f3n de callback<\/strong> en sus t\u00e9rminos m\u00e1s simples, es una funci\u00f3n que se pasa a otra funci\u00f3n, como par\u00e1metro. La <strong>funci\u00f3n de callback<\/strong> se ejecuta dentro de la funci\u00f3n donde se pasa y el resultado final se devuelve a la persona que hace el llamado.<\/p>\n<p>Simple, \u00bfverdad? Ahora vamos a implementar una funci\u00f3n de callback para obtener resultados de nivelaci\u00f3n en un juego imaginario.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n\/\/ levelOne() se llama una funci\u00f3n de alto orden porque&#13;\n\/\/ acepta otra funci\u00f3n como par\u00e1metro.&#13;\nfunction levelOne(value, callback) {&#13;\nvar newScore = value + 5;&#13;\ncallback(newScore);&#13;\n}&#13;\n&#13;\n\/\/ Ten en cuenta que no es obligatorio hacer referencia a la funci\u00f3n de callback (l\u00ednea #3) como callback, sino que se denomina as\u00ed s\u00f3lo para una mejor comprensi\u00f3n.&#13;\n&#13;\nfunction startGame() {&#13;\nvar currentScore = 5;&#13;\nconsole.log('Game Started! Current score is ' +\u00a0 currentScore);&#13;\n\/\/ Aqu\u00ed el segundo par\u00e1metro que estamos pasando a levelOne es la funci\u00f3n callback, es decir, una funci\u00f3n que se pasa como par\u00e1metro.&#13;\nlevelOne(currentScore, function (levelOneReturnedValue) {&#13;\nconsole.log('Level One reached! New score is ' +\u00a0 levelOneReturnedValue);&#13;\n});&#13;\n}&#13;\n&#13;\nstartGame();&#13;\n<\/pre>\n<p>Una vez dentro de la funci\u00f3n <strong>startGame(),<\/strong> llamamos a la funci\u00f3n <strong>levelOne()<\/strong> con par\u00e1metros como <strong>currentScore<\/strong> y nuestra funci\u00f3n <strong>callback().<\/strong><\/p>\n<p>Cuando llamamos <strong>levelOne()<\/strong> dentro del \u00e1mbito de la funci\u00f3n <strong>startGame(),<\/strong> de forma as\u00edncrona, JavaScript ejecuta la funci\u00f3n <strong>levelOne()<\/strong> y el hilo principal sigue adelante con la parte restante de nuestro c\u00f3digo.<\/p>\n<p>Esto significa que podemos hacer todo tipo de operaciones como obtener datos de una API, hacer c\u00e1lculos matem\u00e1ticos, etc., todo lo cual puede consumir mucho tiempo y, por lo tanto, no estaremos bloqueando nuestro hilo principal para ello. Una vez que la <strong>function(levelOne())<\/strong> ha hecho con sus operaciones, puede ejecutar la funci\u00f3n <strong>callback<\/strong> que pasamos anteriormente.<\/p>\n<p>Esta es una caracter\u00edstica muy \u00fatil de la programaci\u00f3n de funciones, ya que las <strong>callbacks<\/strong> nos permiten manejar el c\u00f3digo asincr\u00f3nicamente sin tener que esperar una respuesta. Por ejemplo, puede hacer una llamada de ajax a un servidor lento con una funci\u00f3n de <strong>callback<\/strong> y olvidarse completamente de ello y continuar con el c\u00f3digo restante. Una vez que se resuelve esa llamada de ajax, la funci\u00f3n de devoluci\u00f3n de llamada se ejecuta autom\u00e1ticamente.<\/p>\n<p>Pero las <strong>Callbacks<\/strong> pueden volverse desagradable si hay m\u00faltiples niveles de callbacks a ser ejecutados en una cadena. Tomemos el ejemplo anterior y agreguemos algunos niveles m\u00e1s a nuestro juego.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\nfunction levelOne(value, callback) {&#13;\nvar newScore = value + 5;&#13;\ncallback(newScore);&#13;\n}&#13;\n&#13;\nfunction levelTwo(value, callback) {&#13;\nvar newScore = value + 10;&#13;\ncallback(newScore);&#13;\n}&#13;\n&#13;\nfunction levelThree(value, callback) {&#13;\nvar newScore = value + 30;&#13;\ncallback(newScore);&#13;\n}&#13;\n&#13;\n\/\/ Ten en cuenta que no es necesario hacer referencia a la funci\u00f3n de callback como callback cuando llamamos levelOne(), levelTwo() o levelTree(), ya que puede denominarse cualquier cosa.&#13;\n&#13;\nfunction startGame() {&#13;\nvar currentScore = 5;&#13;\nconsole.log('Comenz\u00f3 el juego! La puntuaci\u00f3n actual es ' + currentScore);&#13;\nlevelOne(currentScore, function (levelOneReturnedValue) {&#13;\nconsole.log('\u00a1Nivel Uno alcanzado! El nuevo puntaje es ' + levelOneReturnedValue);&#13;\nlevelTwo(levelOneReturnedValue, function (levelTwoReturnedValue) {&#13;\nconsole.log(\u00a1Nivel Dos alcanzado! El nuevo puntaje es ' + levelTwoReturnedValue);&#13;\nlevelThree(levelTwoReturnedValue, function (levelThreeReturnedValue) {&#13;\nconsole.log('\u00a1Nivel Tres alcanzado! El nuevo puntaje es ' + levelThreeReturnedValue);&#13;\n});&#13;\n});&#13;\n});&#13;\n&#13;\n}&#13;\n&#13;\nstartGame();&#13;\n&#13;\n<\/pre>\n<p>Espera, \u00bfqu\u00e9 acaba de pasar? Hemos a\u00f1adido dos nuevas funciones para la l\u00f3gica de nivel, <strong>levelTwo()<\/strong> and <strong>levelThree().<\/strong> Within <strong>levelOne\u2019s callback(l\u00ednea #22),<\/strong> llamada funci\u00f3n <strong>levelTwo()<\/strong> con una funci\u00f3n de <strong>callback<\/strong> y el resultado de <strong>callback<\/strong> from <strong>levelOne.<\/strong> Y se repite lo mismo para la funci\u00f3n de nivel tres.<\/p>\n<p>Ahora s\u00f3lo imagina en qu\u00e9 se convertir\u00e1 este c\u00f3digo si tuvi\u00e9ramos que implementar la misma l\u00f3gica para otros 10 niveles. \u00bfYa est\u00e1s entrando en p\u00e1nico? \u00a1Bueno, yo s\u00ed! A medida que aumenta el n\u00famero de funciones de callback anidadas, se hace m\u00e1s dif\u00edcil leer el c\u00f3digo e incluso m\u00e1s dif\u00edcil de depurar.<\/p>\n<p>Esto a menudo se conoce cari\u00f1osamente como un <em>infierno de callback<\/em>. \u00bfHay alguna forma de salir de este infierno de callbacks?<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Te-prometo-que-hay-una-forma-mejor\"><\/span>Te prometo que hay una forma mejor<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Javascript empez\u00f3 a apoyar <strong>Promises from ES6<\/strong>. Las promesas son b\u00e1sicamente objetos que representan la finalizaci\u00f3n (o el fracaso) de una operaci\u00f3n as\u00edncrona, y su valor resultante.<\/p>\n<p>Tratemos de reescribir nuestro ejemplo de callback infiernal con promesas ahora.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\nfunction levelOne(value) {&#13;\nvar promise, newScore = value + 5;&#13;\nreturn promise = new Promise(function(resolve) {&#13;\nresolve(newScore);&#13;\n});&#13;\n}&#13;\n&#13;\nfunction levelTwo(value) {&#13;\nvar promise, newScore = value + 10;&#13;\nreturn promise = new Promise(function(resolve) {&#13;\nresolve(newScore);&#13;\n});&#13;\n}&#13;\n&#13;\nfunction levelThree(value) {&#13;\nvar promise, newScore = value + 30;&#13;\nreturn promise = new Promise(function(resolve) {&#13;\nresolve(newScore);&#13;\n});&#13;\n}&#13;\n&#13;\nvar startGame = new Promise(function (resolve, reject) {&#13;\nvar currentScore = 5;&#13;\nconsole.log('Comenz\u00f3 el juego! La puntuaci\u00f3n actual es ' + currentScore);&#13;\nresolve(currentScore);&#13;\n});&#13;\n&#13;\n\/\/ La respuesta desde startGame se pasa autom\u00e1ticamente a la funci\u00f3n dentro de la subsiguiente ventana de di\u00e1logo.&#13;\nstartGame.then(levelOne)&#13;\n.then(function (result) {&#13;\n\/\/ el valor del resultado es la promesa devuelta de la funci\u00f3n levelOne&#13;\nconsole.log('Has llegado al Nivel Uno! El nuevo puntaje es ' + result);&#13;\nreturn result;&#13;\n})&#13;\n.then(levelTwo).then(function (result) {&#13;\nconsole.log('Has llegado al Nivel Dos! El nuevo puntaje es ' + result);&#13;\nreturn result;&#13;\n})&#13;\n.then(levelThree).then(function (result) {&#13;\nconsole.log('Has llegado al Nivel Tres! El nuevo puntaje es ' + result);&#13;\n});&#13;\n&#13;\n<\/pre>\n<p>Hemos reescrito nuestras funciones de nivel (Uno\/Dos\/Tres) para eliminar las callbacks del par\u00e1metro de funciones y en lugar de llamar a la funci\u00f3n de callback dentro de ellas, las hemos reemplazado con promesas.<\/p>\n<p>Una vez que se resuelve <strong>startGame,<\/strong> podemos simplemente llamar a un m\u00e9todo<strong> .then()<\/strong> en \u00e9l y manejar el resultado. Podemos encadenar m\u00faltiples promesas una tras otra con encadenamiento <strong>.then()<\/strong> .<\/p>\n<p>Esto hace que todo el c\u00f3digo sea mucho m\u00e1s legible y m\u00e1s f\u00e1cil de entender en t\u00e9rminos de lo que est\u00e1 sucediendo, y luego de lo que sucede a continuaci\u00f3n y as\u00ed sucesivamente.<\/p>\n<p>La raz\u00f3n profunda por la que las promesas son a menudo mejores es que son m\u00e1s componibles, lo que significa que combinar m\u00faltiples promesas \u00abs\u00f3lo funciona\u00bb, mientras que combinar m\u00faltiples callbacks a menudo no lo hace.<\/p>\n<p>Adem\u00e1s, cuando tenemos una sola callback contra una sola promesa, es cierto que no hay una diferencia significativa. Es cuando tienes un mill\u00f3n de callbacks contra un mill\u00f3n de promesas que el c\u00f3digo basado en promesas tiende a verse mucho mejor.<\/p>\n<p>De acuerdo, hemos escapado con \u00e9xito del infierno de la callback y hemos hecho nuestro c\u00f3digo mucho m\u00e1s legible con promesas. Pero, \u00bfy si te dijera que hay una manera de hacerlo m\u00e1s limpio y legible?<\/p>\n<h3><span class=\"ez-toc-section\" id=\"aWait-for-it\"><\/span><strong>(a)Wait<\/strong> for it<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Async-wait est\u00e1 soportado en javascript desde ECMA2017. Permiten escribir c\u00f3digo basado en promesas como si fuera c\u00f3digo sincr\u00f3nico, pero sin bloquear el hilo principal. Hacen que su c\u00f3digo as\u00edncrono sea menos \u00abinteligente\u00bb y m\u00e1s legible.<\/p>\n<p>Para ser honesto, las asincrasias no son m\u00e1s que az\u00facar sint\u00e1ctico por encima de las promesas, pero hacen que el c\u00f3digo asincr\u00f3nico parezca y se comporte un poco m\u00e1s como c\u00f3digo sincr\u00f3nico, ah\u00ed es precisamente donde reside su poder.<\/p>\n<p>Si utiliza la palabra clave Async antes de la definici\u00f3n de una funci\u00f3n, puede utilizar la opci\u00f3n de espera dentro de la funci\u00f3n. Cuando usted espera una promesa, la funci\u00f3n se detiene de una manera que no bloquee hasta que se cumpla la promesa. Si la promesa se cumple, se recupera el valor. Si la promesa es rechazada, el valor rechazado es lanzado.<\/p>\n<p>Veamos ahora c\u00f3mo se ve nuestra l\u00f3gica de juego una vez que la reescribamos con <strong>async-awaits.<\/strong><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\nfunction levelOne(value) {&#13;\nvar promise, newScore = value + 5;&#13;\nreturn promise = new Promise(function(resolve) {&#13;\nresolve(newScore);&#13;\n});&#13;\n}&#13;\n&#13;\nfunction levelTwo(value) {&#13;\nvar promise, newScore = value + 10;&#13;\nreturn promise = new Promise(function(resolve) {&#13;\nresolve(newScore);&#13;\n});&#13;\n}&#13;\n&#13;\nfunction levelThree(value) {&#13;\nvar promise, newScore = value + 30;&#13;\nreturn promise = new Promise(function(resolve) {&#13;\nresolve(newScore);&#13;\n});&#13;\n}&#13;\n&#13;\n\/\/ la palabra clave async le dice al motor javascript que cualquier funci\u00f3n dentro de esta funci\u00f3n que tenga la palabra clave en await, debe ser tratada como c\u00f3digo as\u00edncrono y debe continuar ejecut\u00e1ndose s\u00f3lo una vez que esa funci\u00f3n se resuelva o falle.&#13;\n&#13;\n<\/pre>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\nasync function startGame() {&#13;\nvar currentScore = 5;&#13;\nconsole.log('Comenz\u00f3 el juego! La puntuaci\u00f3n actual es ' + currentScore);&#13;\ncurrentScore = await levelOne(currentScore);&#13;\nconsole.log('Has llegado al Nivel Uno! El nuevo puntaje es ' + currentScore);&#13;\ncurrentScore = await levelTwo(currentScore);&#13;\nconsole.log('Has llegado al Nivel Dos! El nuevo puntaje es ' + currentScore);&#13;\ncurrentScore = await levelThree(currentScore);&#13;\nconsole.log(Has llegado al Nivel Tres! El nuevo puntaje es ' + currentScore);&#13;\n}&#13;\n&#13;\nstartGame();&#13;\n&#13;\n<\/pre>\n<p>Inmediatamente nuestro c\u00f3digo se vuelve mucho m\u00e1s legible, pero hay m\u00e1s en <strong>Async-await.<\/strong><\/p>\n<p>La gesti\u00f3n de errores es una de las principales caracter\u00edsticas de Async-await que destaca. Finalmente podemos manejar tanto errores s\u00edncronos como as\u00edncronos con la misma construcci\u00f3n con try and catches, lo cual fue una molestia con promesas sin duplicar los bloques de try-catch.<\/p>\n<p>La siguiente mejor mejora del mundo de las buenas y viejas promesas es la depuraci\u00f3n de c\u00f3digo. Cuando escribimos promesas basadas en funciones de flecha, no podemos establecer puntos de interrupci\u00f3n dentro de nuestras funciones de flecha, por lo que la depuraci\u00f3n es dif\u00edcil a veces. Pero con async-awaits, la depuraci\u00f3n es como si se tratara de un fragmento de c\u00f3digo sincr\u00f3nico<\/p>\n<\/p><\/div>","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras grandes, funciones de flecha, plantillas literales, etc. Callbacks&#8230;<\/p>","protected":false},"author":1,"featured_media":95579,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1374],"tags":[],"class_list":["post-95578","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>Funciones as\u00edncronas - R Marketing Digital<\/title>\n<meta name=\"description\" content=\"Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras\" \/>\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\/funciones-asincronas\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Funciones as\u00edncronas\" \/>\n<meta property=\"og:description\" content=\"Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rmarketingdigital.com\/en\/javascript\/funciones-asincronas\/\" \/>\n<meta property=\"og:site_name\" content=\"R Marketing Digital\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-23T14:38:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/1dc7dfdb-2104576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"580\" \/>\n\t<meta property=\"og:image:height\" content=\"350\" \/>\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\\\/funciones-asincronas\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/\"},\"author\":{\"name\":\"R Marketing Digital\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\"},\"headline\":\"Funciones as\u00edncronas\",\"datePublished\":\"2022-08-23T14:38:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/\"},\"wordCount\":1114,\"image\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/1dc7dfdb-2104576.png\",\"articleSection\":[\"Javascript\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/\",\"name\":\"Funciones as\u00edncronas - R Marketing Digital\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/1dc7dfdb-2104576.png\",\"datePublished\":\"2022-08-23T14:38:09+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\"},\"description\":\"Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/funciones-asincronas\\\/#primaryimage\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/1dc7dfdb-2104576.png\",\"contentUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/1dc7dfdb-2104576.png\",\"width\":580,\"height\":350,\"caption\":\"1dc7dfdb-2104576-6853782-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":"Funciones as\u00edncronas - R Marketing Digital","description":"Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras","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\/funciones-asincronas\/","og_locale":"en_US","og_type":"article","og_title":"Funciones as\u00edncronas","og_description":"Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras","og_url":"https:\/\/rmarketingdigital.com\/en\/javascript\/funciones-asincronas\/","og_site_name":"R Marketing Digital","article_published_time":"2022-08-23T14:38:09+00:00","og_image":[{"width":580,"height":350,"url":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/1dc7dfdb-2104576.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\/funciones-asincronas\/#article","isPartOf":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/"},"author":{"name":"R Marketing Digital","@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e"},"headline":"Funciones as\u00edncronas","datePublished":"2022-08-23T14:38:09+00:00","mainEntityOfPage":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/"},"wordCount":1114,"image":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/#primaryimage"},"thumbnailUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/1dc7dfdb-2104576.png","articleSection":["Javascript"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/","url":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/","name":"Funciones as\u00edncronas - R Marketing Digital","isPartOf":{"@id":"https:\/\/rmarketingdigital.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/#primaryimage"},"image":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/#primaryimage"},"thumbnailUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/1dc7dfdb-2104576.png","datePublished":"2022-08-23T14:38:09+00:00","author":{"@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e"},"description":"Este art\u00edculo est\u00e1 dirigido a personas que empiezan con codificaci\u00f3n as\u00edncrona en JavaScript para que podamos mantener las cosas simples evitando palabras","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rmarketingdigital.com\/javascript\/funciones-asincronas\/#primaryimage","url":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/1dc7dfdb-2104576.png","contentUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/1dc7dfdb-2104576.png","width":580,"height":350,"caption":"1dc7dfdb-2104576-6853782-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\/95578","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=95578"}],"version-history":[{"count":0,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts\/95578\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/media\/95579"}],"wp:attachment":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/media?parent=95578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/categories?post=95578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/tags?post=95578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}