前端worker之web worker

pqjwyn 2017-11-28 原文

前端worker之web worker

web worker

背景

众所周知javascript是单线程的,同一时间内只能做一件事情。
这是十分必要的,设想,如果js是多线程的。有个dom元素两个线程同时做了改变,一个display:none,另一个display:block,这样让浏览器就无所适从了。出于此种考虑,单线程的js就这样一直延续下来,但是凡事必有两面性,虽然单线程保证了一些ui操作的可行性,但一些比较耗时任务, 单线程的js执行起来就会有一些不太好的体验。好一点是一直loading的提示条,更甚的可能连提示都没有,即所谓的假死状态。web worker就应运而生了。

什么是web worker

Web Workers 使得一个Web应用程序可以在与主执行线程分离的后台线程中运行一个脚本操作。把那些耗时的操作放在该线程中执行,这样就避免了主线程即UI线程被阻塞。

简而言之,就是在主线程即负责ui交互的js之外,新开一个后台脚本负责费时操作的执行。本来可能阻塞UI的操作,就直接不与dom打交道避免长时间阻塞,执行完成之后通知主线程即可。

web worker上下文

正如前面提到的,web worker诞生的目的在于解决耗时操作对ui交互的影响,所以worker不能访问和操作dom的,如果有这个能力那么上面提到同时操作的问题就又会出现了。

worker中的上下文和主线程js的上下文对象是不同的,window不是它的顶层对象,所以window相关的一些方法如alert等时不能使用的,还有dom也是不能访问的。不过基本的方法。例如console.log、setTimeout等可以访问。

worker常见可用API和属性

  • setInterval/clearInterval
  • setTimeout/setInterval
  • Cache
  • Console API
  • CustomEvent
  • Fetch
  • FileReader/FileReaderSync
  • FormData
  • Promise
  • WebSocket
  • XMLHttpRequest

等,更多请查看Functions and classes available to Web Workers

如何创建 web worker

创建一个web worker 十分简单,只需要new worker(path),path为worker文件的路径。如下面代码所示:

        // 检测是否支持window.Worker
        if (window.Worker) {
            // 指定worker文件路径,据此创建Worker
            var worker = new Worker('./ww.js')
            // 监控message,当收到worker信息时执行
            worker.onmessage = function (e) {
                var div = document.querySelector('#root')
                div.innerHTML = e.data
            }
        }

通信机制

主线程js与worker 线程之间通信机制比较简单。两者通过postMessage和onmessage来传递信息。

  • postMessage:发送信息,主线程js和worker都可以通过该方法发送消息,不过主线程中该方法是worker的方法,worker中可以直接调用。
  • onmessage: 接受信息的事件,后面跟相应回调。
    具体代码如下:
            /* 主线程js发送接受消息 */
            // 指定worker文件路径,据此创建Worker
            var worker = new Worker('./ww.js')
            var isFirst = true
            // 监听message事件,当收到worker信息时执行
            worker.onmessage = function(e){
                var div = document.querySelector('#root')
                div.innerHTML = e.data
                // 首次执行,发送信息给worker
                isFirst && worker.postMessage('来自主线程的消息')
                isFirst =false
            }    

worker :

/* worker 接受发送消息 */
// 2s之后执行循环,并发送
postMessage('执行结果' + j + '执行结束时间' + new Date().toLocaleTimeString())

onmessage = function (e) {
    console.log(e)
    postMessage(e.data)
}

更多worker

除了上面提到的worker之外还要一下几种worker。

  • Shared Workers 共享worker。可被对多个脚本运行在不同的窗体,例如IFrames等, 只要这些workers处于同一域名。共享worker 比专用 worker 稍微复杂一点 — 脚本必须通过活动端口进行通讯。详情请见SharedWorker。
  • Service Workers 一般作为web应用程序、浏览器和网络(如果可用)之前的代理服务器。目前比较热的PWA就是基于该技术实现的。当然也不仅仅用于缓存资源二用,作为代理可以用其实现更多的功能,例如访问推送通知和后台同步等。
  • Chrome Workers 是一种仅适用于firefox的worker。详情请见ChromeWorker
  • 音频 Workers可以在网络worker上下文中直接完成脚本化音频处理.

    参考文档

    Web Workers API

    结束语

    至此关于web worker 的简单介绍就结束了,前段时间看了下websocket和PWA所以就一起看一下web worker和service worker。抛砖引玉,希望大家共同进步,更多请查看我的实例demo

发表于 2017-11-28 23:00 潇湘待雨 阅读() 评论() 编辑 收藏

 

版权声明:本文为pqjwyn原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/pqjwyn/p/7912703.html

前端worker之web worker的更多相关文章

  1. [译]javascript中的依赖注入

    前言 在上文介绍过控制反转之后,本来打算写篇文章介绍下控制反转的常见模式-依赖注入。在翻看资料的时候,发现了一 […]...

  2. 由自定义事件到双向绑定

    前言 除了大家经常提到的自定义事件之外,浏览器本身也支持我们自定义事件,我们常说的自定义事件一般也都是用于项目 […]...

  3. 关于CORS 应该注意的几点

    前言 对于跨域,随着w3c的CORS的出现,相比较于有些年头的jsonp,CORS以其简单安全,支持post的 […]...

  4. YAML & JSON &XML如何选择

    前言 本文翻译https://www.csestack.org/yaml-vs-json-vs-xml-dif […]...

  5. 由自定义事件到vue数据响应

    前言 除了大家经常提到的自定义事件之外,浏览器本身也支持我们自定义事件,我们常说的自定义事件一般用于项目中的一 […]...

  6. f5到底刷新了点什么,你知道吗

    引言 前面翻到了http缓存相关内容,关于强制缓存和协商缓存,他们之间的差别可能大家比较清楚。 并且常规情况下 […]...

  7. 其实你可以少写点if else和switch

    前言 作为搬砖在第一线的底层工人,业务场景从来是没有做不到只有想不到的复杂。 不过他强任他强,if-else全 […]...

  8. 带着问题看redux源码

    前言 作为前端状态管理器,这个比较跨时代的工具库redux有很多实现和思想值得我们思考。在深入源码之前,我们可 […]...

随机推荐

  1. 蛮力法求解简单背包问题

     从穷举的思路出发,通过求出number件物品的所有组合,并判断每一组合的物品体积是否等于背包容量ratedC […]...

  2. 程序员怎么应对非软件型公司?

    最近工作感觉很不顺,心理也不开心,就是感觉自己无论怎么努力,别人都没有把程序员当成是人来看待。心理觉得委屈。就 […]...

  3. 数据采集与分析的那些事——从数据埋点到AB测试

    作者:网易有数郑栋。   一、为什么企业需要一套完善的用户行为埋点和分析平台   产品初创期间,需要分析天使用 […]...

  4. 快速切换IP的批处理!

    内容如下: @echo off color 1A Title [SMART专用 IP设置V1.0] cls e […]...

  5. Github 镜像资源

    1.GitHub 镜像访问 这里提供两个最常用的镜像地址(别登录账号):https://github.com. […]...

  6. 截止9月20日,xx行动中已知漏洞

    VMware Fusion cve-2020-3980权限提升 Apache Cocoon security […]...

  7. 防范DDoS攻击的15个方法

      0x01 背景 为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解.。简单 […]...

  8. 谷歌提示adobe flash player旧版被屏蔽需要更新

    最近两天谷歌遇到问题,一直提示 谷歌提示adobe flash player旧版被屏蔽需要更新,每次刷新页面都 […]...

展开目录

目录导航