美文网首页
JavaScript---Web Worker使用教程

JavaScript---Web Worker使用教程

作者: 刘翾 | 来源:发表于2017-11-09 08:58 被阅读10次

    简介

    web worker 是运行在后台的 JavaScript,不会影响页面的性能。例如处理类似<a href="blog.csdn.net/c_kite/article/details/69415183">高斯函数处理图片</a>这种处理信息量比较庞大时有可能会造成页面阻塞, 因此这种时候就可以通过Worker创建一个线程在后台处理信息, 当处理完成时会把信息返回回来.

    兼容性

    Internet Explorer 10, Firefox, Chrome, Safari 和 Opera 都支持Web workers.


    这里写图片描述这里写图片描述

    Worker运行环境

    • 一个navigator对象, 只包含四个属性: appName, appVersion, userAgent和platform
    • 一个location对象(与window.location相同), 不过所有属性都是只读
    • 一个self对象, 指向全局worker对象.
    • 一个importScripts( )方法, 用来加载Worker所用到的外部javascript文件
    • 所有的ECMAScript对象, 诸如: Object, Array, Date等.
    • XMLHTTPRequest构造器
    • setTimeout( ) 和 setInterval( )
    • 一个close( )方法, 它能立刻停止worker运行

    由于Web Worker有着不同的全局环境, 因此你无法出从Javascript代码中创建它. 事实上, 你需要创建一个完全独立的JavaScript文件, 其中包含了需要在Worker中运行的代码. 要创建网页人工线程, 你必须传入这个Javascript文件的URL:

    var worker = new Worker("code.js");
    

    此代码一旦执行, 将为这个文件创建一个新的线程和一个新的Worker运行环境. 该文件会被异步下载, 直到文件下载并执行完成后才会启动此Worker

    与Worker通信

    worker与网页代码通过事件接口进行通信. 网页代码可以通过postMessage( )方法给worker传递数据, 它接收一个参数, 即需要传递给Worker的数据. 此外, Worker还有一个用来接收信息的onmessage事件处理器. 例如:

    var worker = new Worker("code.js");
    worker.onmessage = function(event) {
        alert(event.data);
    }
    worker.postMessage("Hi");
    

    Worker通过触发message事件来接收数据. 定义onmessage事件处理器之后, 该事件对象具有一个data属性用于存放传入的数据. Worker可通过它自己的postMessage( )方法把信息传给页面:

    //code.js内部代码
    //self是全局worker对象
    self.onmessage = function(event) {
        self.postMessage("Hello!");
    }
    

    加载外部文件

    importScripts( )的调用过程是阻塞的, 直到所有文件加载并执行完成之后, 脚本才会继续运行. 由于Worker在UI线程之外运行, 所以这种阻塞并不会影响UI响应.

    //code.js内部代码
    importScripts("file1.js", "file2.js");
    
    self.onmessage = function( ) {
    
    }
    

    实际应用

    Web Worker适用于那些处理纯数据, 或者与浏览器UI无关的长时间运行脚本.

    例: 解析一个很大的JSON字符串, 正常执行需大概500毫秒, 因此这时可以使用Web Worker. 见下方代码.

    var worker = new Worker("code.js");
    
    //数据就位时, 调用事件处理器
    worker.onmessage = function(event) {
        
        //JSON结构被回传回来
        var jsonData = event.data;
    
        //使用JSON
        execute(jsonData);
    }
    
    //传入要解析的大段JSON字符串
    worker.postMessage(jsonText);
    
    
    
    
    //code.js文件内部代码, worker解析
    self.onmessage = function(event) {
        //JSON字符串由event.data传入
    
        //解析
        var jsonData = JSON.parse(jsonText);
    
        //回传结果
        self.postMessage(jsonData);
    }
    

    相关文章

      网友评论

          本文标题:JavaScript---Web Worker使用教程

          本文链接:https://www.haomeiwen.com/subject/bshumxtx.html