美文网首页首页投稿(暂停使用,暂停投稿)
初识JavaScript工作线程—2017年7月28日

初识JavaScript工作线程—2017年7月28日

作者: 倀空 | 来源:发表于2017-07-28 16:14 被阅读0次

    JavaScript工作线程

    进程与线程

    JavaScript一次只能做一件事,但是有了HTML5和Web工作线程,一切都改变了

    对于很多应用来说,JavaScript的单线程计算模式确实表现不错,而且可以让编程变得简单,但是在编写计算密集的代码时,就会影响JavaScript的能力,而且会占用大量等待时间。

    但是有了web工作线程,就可以创建一个另外的web工作线程,它会在一个单独的线程中运行,由它完成所有艰巨的工作

    • 要使用web工作线程,浏览器首先必须创建一个或多个工作线程,每个工作线程都由各自的JavaScript定义,其中包含完成工作所需的全部代码
    • 工作线程生活在一个相当受限的世界中,它们无法访问主浏览器代码能够访问的很多运行时的对象,如DOM或主代码中的所有变量和函数
    • 要让一个工作线程开始工作,浏览器通常会向它发送一个消息,然后开始工作
    • 工作线程完成它的工作后,会发送消息,并返回最终的处理结果


      第一个工作线程

    第一个Web工作线程

    在正式创建一个工作线程之前,首先当然是检查浏览器是否支持Web工作线程

    if(!window["worker"]){
        alert("Bummer,no web workers");
    }    //如果浏览器不支持,会弹出消息
    
    如何创建Web工作线程
    var worker = new Worker("worker.js")
    //'worker.js' javascript文件中包含这个工作线程的相应代码
    

    向工作进程分配任务
    postMessage()方法

    window.onload=function(){
        var worker=new Worker("worker.js");
        worker.postMessage("ping");  //发送至工作线程的数据
    }
    //postMessage(); Worker的内置方法,可用于发送任务信息
    //postMessage()方法可发送多种数据,字符串、数组、json对象...但不能发送函数
    

    除了发布任务,我们还需获取到最终的成果
    onmessage()方法,可用于接收来自工作线程的消息

    window.onload=function(){
        var worker=new Worker("worker.js");
        worker.postMessage("ping");  //发送至工作线程的数据
    
        /* 接收到工作线程的消息后,立刻调用该函数 */
        worker.onmessage=function(event){
            //event 表示接收到的,来自工作线程的数据对象
            //data属性包含工作线程发送的消息
            var message = "Worker says"+event.data;
            document.getElementById("status").textContent=message;
        }
    }
    

    编写工作线程(写在 worker.js 中)

    工作线程最基本的要求就是能接收从主代码中发送过来的任务
    为此,我们还要使用另一个onmessage处理程序

    onmessage=function(event){
    
    }
    

    编写工作线程的消息处理程序

    /***** 编辑在worker.js *****/
    onmessage=function(event){
        if(event.data=="ping"){
            postMessage(" pong");
        }
    }
    //工作线程同样使用postMessage()来发送消息
    

    到此,一个完整的案例就基本编写完成了,现在补上HTML完整代码

    <!DOCTYPE html>
    <html lang="zh-cmn-Hans">
    <head>
    <meta charset="utf-8">
    <title>JavaScript工作线程</title>
    </head>
    <body>
    <h3 id="status"></h3>
    <script>
    window.onload=function(){
        var worker=new Worker("worker.js");
        worker.postMessage("ping");  //发送至工作线程的数据
    
        /* 接收到工作线程的消息后,立刻调用该函数 */
        worker.onmessage=function(event){
            //event 表示接收到的,来自工作线程的数据对象
            //data属性包含工作线程发送的消息
            var message = "Worker says"+event.data;
            document.getElementById("status").textContent=message;
        }
    }
    </script>
    </body>
    </html>
    

    PS:html文件与worker.js处于同一路径
    如果不是在服务器上运行,chrome浏览器会出现安全性限制,火狐浏览器则不会出现类似问题


    其他参数及作用

    1. event.target;
      target是发出消息的工作线程的一个引用,可以知道这个消息来自哪一个线程
    2. importScripts
      可以使用这个函数向工作线程中导入一个或多个JavaScript文件

    待续.....

    相关文章

      网友评论

        本文标题:初识JavaScript工作线程—2017年7月28日

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