{"id":291,"date":"2024-05-21T10:24:34","date_gmt":"2024-05-21T08:24:34","guid":{"rendered":"https:\/\/blog.sutilweb.eu\/?page_id=291"},"modified":"2024-05-21T10:24:35","modified_gmt":"2024-05-21T08:24:35","slug":"68-la-api-html-web-workers","status":"publish","type":"page","link":"https:\/\/sutilweb.eu\/index.php\/lenguajes\/html5\/html5-manual\/68-la-api-html-web-workers\/","title":{"rendered":"68. La API HTML Web Workers"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Un <strong>Web Worker<\/strong> es un <strong>JavaScript<\/strong> que se ejecuta en segundo plano, sin afectar el rendimiento de la p\u00e1gina.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al ejecutar secuencias de comandos en una p\u00e1gina HTML, la p\u00e1gina deja de responder hasta que finaliza la secuencia de comandos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El siguiente ejemplo crea un <strong>Web Worker<\/strong> simple que cuenta n\u00fameros en segundo plano.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ejm<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;!DOCTYPE html&gt;\n&lt;html lang=\"es\"&gt;\n&lt;head&gt;\n\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;p&gt;Contar n\u00fameros: &lt;output id=\"result\"&gt;&lt;\/output&gt;&lt;\/p&gt;\n&lt;button onclick=\"startWorker()\"&gt;Start Worker&lt;\/button&gt;\n&lt;button onclick=\"stopWorker()\"&gt;Stop Worker&lt;\/button&gt;\n&lt;p&gt;&lt;strong&gt;Ojo: &lt;\/strong&gt;Internet Explorer 9 y versiones m\u00e1s antiguas\nno soportan Web Workers&lt;\/p&gt;\n\n&lt;script&gt;\nvar w;\n\nfunction startWorker(){\n\tif(typeof(Worker) !== \"undefined\"){\n\t\tif(typeof(w) == \"undefined\"){\n\t\t\tw = new Worker(\"demo_workers.js\");\n\t\t}\n\t\tw.onmessage = function(event){\n\t\t\tdocument.getElementById(\"result\").innerHTML = event.data;\n\t\t} else {\n\t\t\tdocument.getElementById(\"result\").innerHTML = \n                  \"Tu navegador no soporta Web Worker\";\n\t\t}\n\t}\n}\n\nfunction stopWorker() {\n\tw.terminate();\n\tw = undefined;\n}\n&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Crear un archivo Web Worker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora, creamos nuestro <strong>Web Worker<\/strong> en un <strong>JavaScript<\/strong> externo. Aqu\u00ed, creamos un script que cuenta. El script se almacena en el archivo \u00ab<em>demo_workers.js<\/em>\u00ab.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">var&nbsp;i =&nbsp;0;\n\nfunction&nbsp;timedCount()&nbsp;{\n&nbsp; i = i +&nbsp;1;\n&nbsp; postMessage(i);\n&nbsp;&nbsp;setTimeout(\"timedCount()\",500);\n}\n\ntimedCount();<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La parte importante del c\u00f3digo anterior es el m\u00e9todo <strong><em>postMessage()<\/em><\/strong>, que se utiliza para enviar un mensaje a la p\u00e1gina HTML.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Nota:<\/strong> Normalmente, los Web Workers no se utilizan para scripts tan simples, sino para tareas m\u00e1s intensivas de CPU.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Crear un objeto Web Worker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora que tenemos el archivo <strong>web worker<\/strong>, debemos llamarlo desde una p\u00e1gina HTML.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las siguientes l\u00edneas verifican si el trabajador ya existe, si no, crea un nuevo objeto <strong>web worker<\/strong> y ejecuta el c\u00f3digo en \u00ab<em>demo_workers.js<\/em>\u00ab.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if&nbsp;(typeof(w) ==&nbsp;\"undefined\") {\n&nbsp; w =&nbsp;new&nbsp;Worker(\"demo_workers.js\");\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Luego podemos enviar y recibir mensajes del <strong>Web Worker<\/strong>. Agregue un detector de eventos \u00ab<em>onmessage<\/em>\u00bb al <strong>Web Worker<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">w.onmessage&nbsp;=&nbsp;function(event){\n&nbsp;&nbsp;document.getElementById(\"result\").innerHTML&nbsp;=&nbsp;event.data;\n};<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando el <strong>Web Worker<\/strong> publica un mensaje, se ejecuta el c\u00f3digo dentro del detector de eventos. Los datos del <strong>Web Worker<\/strong> se almacenan en <strong><em>event.data<\/em><\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Terminar un Web Worker<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando se crea un objeto <strong>Web Worker<\/strong>, continuar\u00e1 escuchando mensajes (incluso despu\u00e9s de que finalice el script externo) hasta que finalice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para terminar un <strong>Web Worker<\/strong> y liberar recursos del navegador\/computadora, use el m\u00e9todo <strong><em>terminate()<\/em><\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">w.terminate();<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Web Workers y el DOM<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dado que los Web Workers est\u00e1n en archivos externos, no tienen acceso a los siguientes objetos de JavaScript<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El objeto <strong><em>window<\/em><\/strong><\/li>\n\n\n\n<li>El objeto <strong><em>document<\/em><\/strong><\/li>\n\n\n\n<li>El objeto <strong><em>parent<\/em><\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Un Web Worker es un JavaScript que se ejecuta en segundo plano, sin afectar el rendimiento de la p\u00e1gina. Al ejecutar secuencias&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":41,"menu_order":67,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-291","page","type-page","status-publish","hentry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"Sutil Web","author_link":"https:\/\/sutilweb.eu\/index.php\/author\/sutilweb\/"},"uagb_comment_info":0,"uagb_excerpt":"Un Web Worker es un JavaScript que se ejecuta en segundo plano, sin afectar el rendimiento de la p\u00e1gina. Al ejecutar secuencias...","_links":{"self":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/comments?post=291"}],"version-history":[{"count":2,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/291\/revisions"}],"predecessor-version":[{"id":293,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/291\/revisions\/293"}],"up":[{"embeddable":true,"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/pages\/41"}],"wp:attachment":[{"href":"https:\/\/sutilweb.eu\/index.php\/wp-json\/wp\/v2\/media?parent=291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}