返回顶部
首页 > 资讯 > 精选 >使用Web Workers需要明白哪些知识
  • 413
分享到

使用Web Workers需要明白哪些知识

2023-06-17 04:06:51 413人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关使用WEB Workers需要明白哪些知识,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。介绍Web Workers允许你在后台运行javascript代码,而不会阻止we

这期内容当中小编将会给大家带来有关使用WEB Workers需要明白哪些知识,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

介绍

Web Workers允许你在后台运行javascript代码,而不会阻止web用户界面。Web  Workers可以提高网页的整体性能,还可以增强用户体验。Web Workers有两种风格 ——专用Web Workers和共享Web  Workers。本文讨论了你所需要知道的Web worker的七个关键方面,帮助你决定在应用程序中使用它们的话。

1.Web Workers允许你在后台运行JavaScript代码

通常,你在Web页面中编写的JavaScript代码在与用户界面相同的线程中执行。这就是为什么当你点击一个会触发漫长处理过程的按钮,网页的用户界面会冻结。除非处理完成,否则你就无法工作于用户界面。Web  worker允许你在后台执行JavaScript,以便用户界面保持响应,即使同时正在执行某些脚本。执行脚本的后台线程通常称为worker thread或worker。你可以生成尽可能多的worker,只要你想。你还可以将数据传递到正在worker thread中执行的脚本,并在完成时将值返回到主线程。然而,Web Workers有一些限制,如下所示:

  • Web Workers无法从web页面访问DOM元素。

  • Web Workers无法从web页面访问全局变量和JavaScript函数。

  • Web Workers不能调用alert()或confirm()函数。

  • 不能在Web Workers中访问诸如窗口,文档和parent这样的对象。

但是,你可以使用setTimeout(),setInterval()等函数。你也可以使用XMLHttpRequest对象向服务器发出ajax请求。

2.Web Workers有两种类型

Web Workers有两种类型:专用Web Workers和共享Web Workers。专用Web  Workers随同创建它们的网页一起存在和死亡。这意味着在网页中创建的专用Web Workers无法通过多个网页访问。另一方面,共享Web  Workers在多个网页之间是共享的。Worker类代表专用Web Workers,而SharedWorker类代表共享Web Workers。

在许多情况下,专用Web Workers就可以满足你的需求。这是因为通常你需要在worker thread中执行一个网页的特定脚本。然而,有时,你需要在worker  thread中执行一个脚本,并且这个worker thread对多个网页通用。在这种情况下,创建许多专用Web  Workers,每个页面一个,还不如使用共享Web Workers。由一个网页创建的共享web  worker仍然可用于其他网页。只有当所有到它的连接被关闭,才能毁坏它。共享Web Workers比专用Web Workers更复杂一点。

3.Worker对象代表专用Web Worker

现在,你了解了Web Workers的基础知识,让我们看看如何使用专用Web  Workers。下面讨论的示例假设你已使用喜欢的开发工具创建了一个Web应用程序,并且还在其Script文件夹中添加了Jquery和Modernizr库。将html页面添加到web应用程序,然后键入以下代码:

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><title></title><script src="scripts/modernizr.js"></script><script src="scripts/jquery-2.0.0.js"></script><script type="text/javascript">         $(document).ready(function () {             if (!Modernizr.webworkers)             {                 alert("This browser doesn't support Web Workers!");                 return;             }             $("#btnStart").click(function () {                 var worker = new Worker("scripts/lengthytask.js");                 worker.addEventListener("message", function (evt) {                     alert(evt.data);                 },false);                 worker.postMessage(10000);             });         });      </script></head><body><fORM><input type="button" id="btnStart" value="Start Processing" /></form></body></html>

上面的HTML页面包含一个触发一些JavaScript处理的按钮(btnStart)。请注意,该网页引用了Modernizr和jQuery库。<script>块包括ready()方法处理程序,并且该处理程序又反过来处理btnStart的单击事件。ready()处理程序首先检查浏览器是否支持web  workers。这通过使用Modernizr的webworkers属性完成。如果浏览器不支持Web  workers,则会向用户显示一条错误消息。

然后代码连接btnStart的点击事件处理程序。点击事件处理程序的代码很重要,因为它使用Worker对象在后台运行脚本。点击事件处理程序创建一个Worker对象并将其存储在本地变量&mdash;&mdash;worker中。要在后台执行的JavaScript文件的路径在构造函数中传递。你将很快创建LengthyTask.js。然后,代码为Worker对象的消息事件添加一个事件处理程序。当目标脚本(在此情况下为LengthyTask.js)将一些值发送回网页时,会引发消息事件。消息事件处理函数可以使用evt.data属性来访问返回的值。***,在Worker对象上调用postMessage()方法来触发LengthyTask.js的执行。   postMessage()方法还允许你将数据传递到目标脚本。在此示例中,将一个数字(10000)传递给postMessage(),postMessage()指示处理应持续的毫秒数量。你可以传递postMessage()调用中的任何其他数据,如JavaScript对象或字符串

LengthyTask.js文件包含要在后台执行的代码,如下所示:

addEventListener("message", function (evt) {var date = new Date();var currentDate = null;do {        currentDate = new Date();    } while (currentDate - date < evt.data);    postMessage(currentDate);}, false);

上面的代码处理worker  thread的消息事件。当主页面调用Worker对象上的postMessage()方法时,会引发消息事件。消息事件处理程序通过运行某些毫秒的do-while循环来模拟冗长的处理。此循环运行的毫秒数从主页传递(回忆前面讨论的postMessage())。因此,evt.data在此示例中返回10000。一旦长时间操作完成,代码调用postMessage()会把处理结果发送回主页面。在本例中,传递currentDate的值(currentDate是一个Date对象)。

如果你运行主网页并单击Start Processing按钮,那么你将在10秒后收到alert()。同时,页面的用户界面不会被阻止,你可以执行诸如滚动,点击等操作,表明来自LengthyTask.js的代码正在后台运行。

4. SharedWorker对象代表共享Web Worker

前面的示例使用了专用Web worker。让我们将同样的示例转换为使用共享Web worker。共享Web worker由SharedWorker对象表示。下面的代码显示了来自主页的代码的修改版本:

$(document).ready(function () {  if (!Modernizr.webworkers)  {    alert("This browser doesn't support Web Workers!");return;  }  $("#btnStart").click(function () { var worker = new SharedWorker("scripts/sharedlengthytask.js"); worker.port.addEventListener("message", function (evt) { alert(evt.data); }, false); worker.port.start(); worker.port.postMessage(10000);   });});

注意用粗体字标记的代码。它创建了一个SharedWorker实例,并在构造函数中传递SharedLengthyTask.js。你将很快创建此文件。然后,代码将消息事件处理程序连接到SharedWorker对象的端口对象。消息处理程序函数执行与前面示例中相同的工作。然后代码在端口对象上调用start()方法。***,在端口对象上调用postMessage()方法将数据(10000)发送到共享worker  thread。

SharedLengthyTask.js文件包含以下代码:

var port;addEventListener("connect", function (evt) {    port = evt.ports[0];    port.addEventListener("message", function (evt) {var date = new Date();var currentDate = null;do {            currentDate = new Date();        } while (currentDate - date < evt.data);        port.postMessage(currentDate);    }, false);    port.start();}, false);

代码首先声明一个名为port的变量,用于存储端口对象的引用。这次处理了两个事件&mdash;&mdash;connect和message。当与共享Web  worker建立连接时,会触发connect事件。 connect事件处理程序捕获evt.port  [0]对象并将其存储在之前声明的端口变量中。然后在端口对象上连接消息事件处理程序。调用端口对象的start()方法来开始侦听该端口上的消息。消息事件处理程序几乎与你在前面的示例中编写的消息事件处理程序相同,除了它附加到端口对象这一点。此外,在端口对象上调用postMessage(),以将处理结果发送到主页面。

5. Web Workers可以使用XMLHttpRequest与服务器通信

有时Web Worker可能需要与Web服务器通信。例如,你可能需要驻留在某些RDBMS中的数据以便于客户端处理。要完成此类任务,你可以使用XMLHttpRequest对象向服务器端资源发出请求。实例化Worker对象和处理消息事件的整个过程保持不变。但是,你需要向服务器端资源发出GET或POST请求。考虑下面的代码:

addEventListener("message", function (evt) { var xhr = new XMLHttpRequest(); xhr.open("GET", "lengthytaskhandler.ashx"); xhr.onload = function () { postMessage(xhr.responseText); }; xhr.send(); }, false);

上面显示的代码创建了XMLHttpRequest对象的实例。然后调用open()方法,并指定向服务器端资源LengthyTaskHandler.ashx(一个asp.net通用处理程序)发出GET请求。(虽然此示例使用ASP.net通用处理程序,但你可以使用任何其他服务器端资源。)然后它处理XMLHttpRequest对象的load事件并调用postMessage()。  xhr.responseText作为postMessage()的参数。xhr.responseText将是ASP.NET通用处理程序作为响应返回的值。请求完成时引发load事件。

LengthyTaskHandler.ashx包含以下代码:

namespace WebWorkersDemo{public class LengthyTaskHandler : IHttpHandler{public void ProcessRequest(HttpContext context) { System.Threading.Thread.Sleep(10000); context.Response.ContentType = "text/plain"; context.Response.Write("Processing successful!"); }public bool IsReusable        {get{return false;            }        }    }}

正如你可以看到,ProcessRequest()通过在Thread类上调用Sleep()方法来模拟一些冗长的处理,并阻止执行10秒。然后它返回一个成功消息“Processing  successful!”给调用者。如果你在进行这些更改后运行主网页,你会发现在10秒后,将显示一个包含此成功消息的警报对话框。

6.你可以使用错误事件捕获未处理的错误

如果你的Web  worker正在进行一些复杂的操作,那么你可能需要添加错误处理到主网页代码,以便在worker中出现任何未处理错误时,可以采取适当的操作。这可以通过处理Worker对象的错误事件来完成。每当work  thread中存在任何未处理的错误时,就会抛出错误事件。以下代码显示了如何完成此操作:

$("#btnStart").click(function () {  var worker = new Worker("scripts/lengthytask.js");  worker.addEventListener("message", function (evt) {    alert(evt.data);  }, false); worker.addEventListener("error", function (evt) { alert("Line #" + evt.lineno + " - " + evt.message + " in " + evt.filename); }, false);   worker.postMessage(10000);});

从上面的代码可以看出,错误处理程序已经连接到worker对象的错误事件。错误处理函数接收一个事件对象,而该对象提供错误信息,例如发生错误的行号(evt.lineno),错误消息(evt.message)和发生错误的文件(evt.filename)。

7.你可以使用Terminate()方法终止worker

有时你可能会想要取消worker中正在执行的任务。对此,你可以通过调用其terminate()方法来摧毁Worker。一旦Worker终止,你就不能重新使用或重新启动它。当然,你总是可以创建另一个Worker实例并使用它。但请记住,terminate()会立即杀死了worker,并且不会给你任何机执行清理操作。

Web workers允许你在后台执行脚本而不冻结网页用户界面。有两种类型&mdash;&mdash;专用web worker和共享web  worker。每个网页创建专用web worker,而跨多个网页使用共享web worker共享。Worker类代表专用web  worker,SharedWorker类代表共享web  worker。

上述就是小编为大家分享的使用Web Workers需要明白哪些知识了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 使用Web Workers需要明白哪些知识

本文链接: https://lsjlt.com/news/287058.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用Web Workers需要明白哪些知识
    这期内容当中小编将会给大家带来有关使用Web Workers需要明白哪些知识,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。介绍Web Workers允许你在后台运行JavaScript代码,而不会阻止we...
    99+
    2023-06-17
  • web前端开发都需要学习哪些知识
    web前端开发在目前的IT行业是一个比较重要的岗位,web前端开发是直接与用户接触,前端体验的好坏,以及美观程度是非常重要的,毕竟现在是一个看脸的时代。前端开发需要学习的知识非常的多,非常的杂,一个前端页面的开发,需要涉及很多的知识,且前端...
    99+
    2023-06-03
  • web前端面试需要掌握哪些知识点
    本篇内容主要讲解“web前端面试需要掌握哪些知识点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web前端面试需要掌握哪些知识点”吧!  基本功考察  关于Html  1. html语义化标签的...
    99+
    2023-06-04
  • 使用代理IP需要了解哪些知识
    本篇内容主要讲解“使用代理IP需要了解哪些知识”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用代理IP需要了解哪些知识”吧!很多人每天都在使用代理IP,但是你可能不太清楚代理IP的一些小知识。...
    99+
    2023-06-20
  • Web开发人员需要掌握的知识点有哪些
    这篇文章将为大家详细讲解有关Web开发人员需要掌握的知识点有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 正则表达式正则表达式 常用于字符串的解析.其最基础的运...
    99+
    2024-04-02
  • web运维需要掌握的路由知识点有哪些
    这篇文章主要讲解了“web运维需要掌握的路由知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web运维需要掌握的路由知识点有哪些”吧!路由协议(英语:Routing protoco...
    99+
    2023-06-04
  • 初级Web前端工程师需要掌握哪些知识点
    这篇文章主要讲解了“初级Web前端工程师需要掌握哪些知识点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“初级Web前端工程师需要掌握哪些知识点”吧!什么是初...
    99+
    2024-04-02
  • 学习C#需要哪些基础知识
    学习 C#程需要掌握一些基础知识,这些知识可以帮助您更好地理解C#语言的语法和结构,并顺利地构建应用程序。以下是一些学习C#所需的基础知识:1、编程概念:了解编程的基本概念,如变量、数据类型、运算符、控制结构、循环、函数等,这些概念在大多数...
    99+
    2023-10-22
    C#基础知识
  • 上位机需要具备哪些知识
    上位机开发需要具备多方面的知识,以下是一些关键的知识领域:一、计算机基础知识上位机开发需要具备基本的计算机基础知识,包括计算机体系结构、操作系统、计算机网络等。这些知识将帮助开发人员更好地理解上位机软件的工作原理和实现方式。二、编程语言知识...
    99+
    2023-10-27
    上位机
  • 租用高防服务器时需要明白哪些问题
    租用高防服务器时需要明白的问题有:1、什么是高防服务器;2、高防服务器的特点有哪些;3、高防服务器适合哪些用户;4、如何选择租用高防服务器的数据中心;5、租用高防服务器需要注意什么。具体内容如下:什么是高防服务器高防服务器是独立服务器的一个...
    99+
    2024-04-02
  • 小白要学好Web前端需要掌握哪些方法
    本篇内容介绍了“小白要学好Web前端需要掌握哪些方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、di...
    99+
    2024-04-02
  • web响应式设计你需要了解的知识点有哪些
    web响应式设计你需要了解的知识点有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。   响应式设计就是在网站开发过程中根据用户操作以及设备的环境进行相应的操作...
    99+
    2023-06-08
  • 学习云计算需要哪些软件,需要什么知识面?
    云计算的概念提出很早,只是最近才被人们所关注,这是因为只有在网络带宽和计算速度达到一定水平,才能有云计算实施的基础,而早期提出云计算,因为硬件基础设施还不牢靠,自然缺乏技术落地的基础,被人们所忽略,很多人觉得云计算是天方夜谭,很少有人愿意相...
    99+
    2023-06-03
  • Angular开发者需要学习哪些知识点
    小编给大家分享一下Angular开发者需要学习哪些知识点,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一款to-do app基本等同于前端开发的“Hello world”。虽然涵盖了创建应用程序的CRUD方面,但它通常只涉...
    99+
    2023-06-14
  • CentOS需要掌握的入门知识有哪些
    今天就跟大家聊聊有关CentOS需要掌握的入门知识有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在系统的学习CentOS入门的知识中,我们掌握了一些基本的设置。今天我们来讲一下...
    99+
    2023-06-16
  • Linux新手需要了解的哪些知识点
    这篇文章主要讲解了“Linux新手需要了解的哪些知识点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux新手需要了解的哪些知识点”吧!Linux新手要了解的十个知识点Linux是大小写...
    99+
    2023-06-16
  • 做数据分析需要掌握哪些知识
    这篇文章主要介绍“做数据分析需要掌握哪些知识”,在日常操作中,相信很多人在做数据分析需要掌握哪些知识问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”做数据分析需要掌握哪些知识”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • 需要掌握的Java算法知识有哪些
    本篇内容主要讲解“需要掌握的Java算法知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“需要掌握的Java算法知识有哪些”吧!什么是算法?在Collins大词典中有如下解释:An alg...
    99+
    2023-06-02
  • 上位机编程都需要学哪些知识
    上位机编程是指通过计算机软件对下位机进行控制和监控的过程。下位机可以是各种各样的设备,如机器人、自动化设备、传感器等。下面是一些在学习上位机编程时需要了解的知识。1、编程语言:上位机编程可以使用多种编程语言,如C++、Python、Java...
    99+
    2023-10-27
    上位机 上位机开发
  • Java开发中需要知道的基础知识有哪些
    这篇文章将为大家详细讲解有关Java开发中需要知道的基础知识有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 是一个多功能的编程语言,在某种程度上,它用在几乎所有可能涉及计算机的行业了里。Ja...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作