iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用JS中的webWorker
  • 506
分享到

如何使用JS中的webWorker

2024-04-02 19:04:59 506人浏览 泡泡鱼
摘要

目录一、WEBWorker之初体验二、webWorker之常用API1、postMessage(data)2、terminate()3、message4、error三、worker上

一、webWorker之初体验

所以,javascript是单线程也是有背景的。

如下:


<!DOCTYPE html>
    <head>
        <title>singleThread</title>
        <meta Http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            //添加到任务队列中,待同步任务所处的‘执行栈'执行完毕,1秒后执行任务队列中的这个匿名函数
            setTimeout(function(){
                console.log('come on');
            },1000);
            //只要不关闭该alert,‘执行栈'就没结束,从而也就不会进入到任务队列中
            alert('waiting');
        </script>
    </body>
</html>

但,HTML5引入了一个工作线程(webWorker)的概念。它允许开发人员编写能够长时间运行而不被用户所中断的后台程序,去执行事务或者逻辑,并同时保证页面对用户的响应。

简而言之,就是允许JavaScript创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。

从而,可以用webWorker来处理一些比较耗时的计算。

如下,主页面:


<!DOCTYPE html>
    <head>
        <title>worker</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <script>
            function init(){
                //创建一个Worker对象,并向它传递将在新线程中执行的脚本url
                var worker = new Worker('worker.js');
                //接收worker传递过来的数据
                worker.onmessage = function(event){
                    document.getElementById('result').innerHTML+=event.data+"<br/>" ;
                };
            };
        </script>
    </head>
    <body onload = "init()">
        <div id="result"></div>
    </body>
</html>

下面是worker.js的内容:


var i = 0;
function timedCount(){
    for(var j = 0, sum = 0; j < 100; j++){
        for(var i = 0; i < 100000000; i++){
            sum+=i;
        };
    };
    //将得到的sum发送回主线程
    postMessage(sum);
};
//将执行timedCount前的时间,通过postMessage发送回主线程
postMessage('Before computing, '+new Date());
timedCount();
//结束timedCount后,将结束时间发送回主线程
postMessage('After computing, ' +new Date());

上面代码执行的流程是:创建的worker对象,并用onmessage方法接收worker.js里面postMessage传递过来的数据(event.data),并将数据追加到div#result中。

所以,执行上面的代码结果如下:

图一

待worker.js中的timedCount方法运算完后,执行postMessage操作,向主线程传数据,得图二。期间,并不影响主线程的运作。

图二

二、webWorker之常用API

接下来,再来看看关于worker的常用api

1、postMessage(data)

子线程与主线程之间互相通信使用方法,传递的data为任意值。


//worker = new Worker('url');
//worker.postMessage传递给子线程数据,对象
worker.postMessage({first:1,second:2});

//子线程中也可以使用postMessage,如传递字符串
postMessage(‘test');

2、terminate()

主线程中终止worker,此后无法再利用其进行消息传递。注意:一旦terminate后,无法重新启用,只能另外创建。


//worker = new Worker('url');
worker.terminate();

如,主页面:


<!DOCTYPE html>
    <head>
        <title>worker</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <script>
            function init(){
                var worker = new Worker('worker.js');
                //每隔100毫秒,向子线程传递{name: 'monkey'}信息
                setInterval(function(){
                    worker.postMessage({name: 'monkey'});
                },100);
                //当主线程worker收到来自子线程的消息后,触发message事件
                worker.onmessage = function(event){
                    document.getElementById('result').innerHTML+=event.data+"<br/>" ;
                    //主线程使用terminate方法中断与子线程来往,在浏览器中只能显示一次event.data
                    worker.terminate();
                };
            };
        </script>
    </head>
    <body onload = "init()">
        <div id="result"></div>
    </body>
</html>

子线程worker.js代码:


//当主线程发来信息后,触发该message事件
onmessage = function(event){
    //向主线程发送event.data.name信息
    postMessage(event.data.name);
};

3、message

当有消息发送时,触发该事件。且,消息发送是双向的,消息内容可通过data来获取。

message使用,可见terminate中的demo

4、error

出错处理。且错误消息可以通过e.message来获取。

如下:


//worker = new Worker('url');
worker.onerror = function(e){
    //打印出错消息
    console.log(e.message);
    //中断与子线程的联系
    worker.terminate();
}

另:worker线程从上到下同步运行它的代码,然后进入异步阶段来对事件及计时器响应,如果worker注册了message事件处理程序,只要其有可能触发,worker就一直在内存中,不会退出,所以通信完毕后得手动在主线程中terminate或者子线程中close掉,但如果worker没有监听消息,那么当所有任务执行完毕(包括计数器)后,他就会退出。

三、worker上下文

先看下面这段代码:

主页面:


<!DOCTYPE html>
    <head>
        <title>worker</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <script>
            function init(){
                var worker = new Worker('worker.js');
                //接收消息事件
                worker.onmessage = function(event){
                    console.log(event.data);
                };
                //错误信息事件
                worker.onerror = function(e){
                    console.log('erro: ' + e.message);
                    //终止线程
                    worker.terminate();
                };
            };
        </script>
    </head>
    <body onload = "init()">
        
    </body>
</html>

worker.js


//window对象的alert方法
alert(1);
onmessage = function(event){
    //向主线程发送event.data.name信息
    postMessage(event.data.name);
};

执行上面代码结果:

为什么会这样呢?原因是alert为window对象的方法,所以会报错undefined。

worker.js执行的上下文,与主页面html执行时的上下文并不相同,最顶层的对象并不是window,woker.js执行的全局上下文,是个叫做WorkerGlobalScope的东东,所以无法访问window、与window相关的DOM API,但是可以与setTimeout、setInterval等协作。

WorkerGlobalScope作用域下的常用属性、方法如下:

1、self

我们可以使用 WorkerGlobalScope 的 self 属性来或者这个对象本身的引用

2、location

location 属性返回当线程被创建出来的时候与之关联的 WorkerLocation 对象,它表示用于初始化这个工作线程的脚步资源的绝对 URL,即使页面被多次重定向后,这个 URL 资源位置也不会改变。

3、close

关闭当前线程,与terminate作用类似

4、importScripts

我们可以通过importScripts()方法通过url在worker中加载库函数

5、XMLHttpRequest

有了它,才能发出ajax请求

6、setTimeout/setInterval以及addEventListener/postMessage

四、关于worker

我们可以做什么:

1.可以加载一个JS进行大量的复杂计算而不挂起主进程,并通过postMessage,onmessage进行通信

2.可以在worker中通过importScripts(url)加载另外的脚本文件

3.可以使用setTimeout(), clearTimeout(), setInterval(), and clearInterval()

4.可以使用XMLHttpRequest来发送请求

5.可以访问navigator的部分属性

局限性:

1.不能跨域加载JS

2.worker内代码不能访问DOM

3.各个浏览器对Worker的实现不大一致,例如FF里允许worker中创建新的worker,而Chrome中就不行

4.IE这个新特性

以上就是浅谈webWorker的详细内容,更多关于浅谈webWorker的资料请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用JS中的webWorker

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用JS中的webWorker
    目录一、webWorker之初体验二、webWorker之常用API1、postMessage(data)2、terminate()3、message4、error三、worker上...
    99+
    2024-04-02
  • 如何使用HTML5的WebWorker
    这篇文章将为大家详细讲解有关如何使用HTML5的WebWorker,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Web Workers 是 HTML5 提供...
    99+
    2024-04-02
  • webworker的使用场景有哪些
    Web Worker 是一种可以在后台运行的 JavaScript 线程,主要用于处理高性能计算和长时间运行的任务,以避免阻塞主线程...
    99+
    2023-09-21
    webworker
  • html5中如何使用js
    这篇文章给大家分享的是有关html5中如何使用js的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 在html5中使用js的两种方法: 使用<script>标签的方...
    99+
    2024-04-02
  • JS中如何使用serialize()
    这篇文章主要介绍了JS中如何使用serialize(),具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:在实际开发场景中,难免遇到需要...
    99+
    2024-04-02
  • js中如何使用Object.prototype.toString.call()
    这篇文章主要为大家展示了“js中如何使用Object.prototype.toString.call()”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中如何...
    99+
    2024-04-02
  • Vue中如何使用js-cookie
    小编给大家分享一下Vue中如何使用js-cookie,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、安装js-cookiecnpm i -S...
    99+
    2023-06-29
  • JS中的Map对象如何使用
    这篇文章主要讲解了“JS中的Map对象如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS中的Map对象如何使用”吧!JS中的Map对象js创建map对象var map&nb...
    99+
    2023-07-05
  • JS前端中的WebSocket如何使用
    这篇文章主要介绍“JS前端中的WebSocket如何使用”,在日常操作中,相信很多人在JS前端中的WebSocket如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JS前端中的WebSocket如何使用...
    99+
    2023-07-05
  • js中的try/catch语句如何使用
    这篇文章主要介绍“js中的try/catch语句如何使用”,在日常操作中,相信很多人在js中的try/catch语句如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中的try/catch语句如何使用...
    99+
    2023-06-20
  • JS中Object.assign方法如何使用
    今天小编给大家分享一下JS中Object.assign方法如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、基本语法...
    99+
    2023-07-02
  • JS中如何使用async与await
    小编给大家分享一下JS中如何使用async与await,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、asyncasync创建一个异步函数来定义一个代码块,在其...
    99+
    2023-06-22
  • js中如何使用filter去重
    这篇文章主要介绍js中如何使用filter去重,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript有什么特点1、js属于一种解释性脚本语言;2、在绝大多数浏览器的支持下,js可以在多种平台下运行,拥有着...
    99+
    2023-06-14
  • js如何避免==的使用
    小编给大家分享一下js如何避免==的使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!避免==的使用这里你可能会有疑问了,有些人喜欢用==,有些人喜欢用===,大...
    99+
    2023-06-27
  • 如何使用JS库
    本篇内容主要讲解“如何使用JS库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用JS库”吧!一、clipboard.js 简介clipboard.js 是...
    99+
    2024-04-02
  • js如何使用window.alert()
    小编给大家分享一下js如何使用window.alert(),相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用 window.al...
    99+
    2024-04-02
  • js如何使用Object.entries
    小编给大家分享一下js如何使用Object.entries,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Object.entries大多数开发人员使用 Objec...
    99+
    2023-06-27
  • js如何使用innerHTML
    这篇文章主要为大家展示了“js如何使用innerHTML”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何使用innerHTML”这篇文章吧。使用 inne...
    99+
    2024-04-02
  • JS event如何使用
    在JavaScript中,事件可以使用以下方式来使用:1. HTML属性:可以将事件直接作为HTML元素的属性来使用。例如,可以使用...
    99+
    2023-08-14
    JS event
  • js如何使用console.log()
    这篇文章主要为大家展示了“js如何使用console.log()”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何使用console.log()”这篇文章吧...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作