zoukankan      html  css  js  c++  java
  • Web Workers入门

    如何创建一个 Web Workers ?

    var worker = new Worker('task.js');    
    worker.onmessage = function(event) {    
        console.log(event.data + " Jan!");    
    };    
    worker.postMessage("Hello");  
    worker.onerror = function(event) {  
        console.log("ERROR: " + event.filename + " (" + event.lineno + "): " + event.message);  
    }  
    

     

    task.js

    self.onmessage = function(event) {  
        var data = event.data + "! My name is";  
        self.postMessage(data);  
    }  
    

    首先要理解,Web Workers 是什么?

     

    Web Workers 就是让浏览器脚本处理实现多线程的规范,旨在解决海量数据处理时导致的页面堵塞情况。

    但Web Worker中的代码无法进行DOM操作。

    因为Worker是一个独立的作用域,独立于浏览器之外,只能进行JavaScript核心(ECMAScript)的操作。

     

    下面介绍一下具体的方法:

     

    Worker

    创建一个新的Web Worker。

    var worker = new Worker('task.js');  
    

    这段代码执行时,浏览器就会加载task.js这个文件。

    js文件加载完成后,不会立刻执行。Worker脚本只有在接收到信息时,才会执行。

    Web Worker目前不能实现跨域脚本。

     

    onmessage

    worker.onmessage = function(event) { ...};   
    

    onmessage 方法需要绑定一个回调函数。

    当触发 message 事件时,回调函数就会执行。并把 Worker脚本 中返回的数据传入回调函数中。

    返回的数据其实是一个 MessageEvent 对象,处理后的数据实际是存放在 MessageEvent对象 的 data属性 中。

     

    postMessage

    worker.postMessage("Hello");
    

    postMessage 方法,用来传递信息,当信息传递成功时,就会触发 message事件。

    postMessage 无论带不带参数,都会触发 message事件。

    并且,postMessage 实现的数据传递,是异步执行的。

    JSON结构的值也能作为参数传递:

     

    worker.postMessage({  
        name: "Jan",  
        age: "99"  
    });   
    

      

    onerror

    worker.onerror = function(event) {  
        console.log("ERROR: " + event.filename + " (" + event.lineno + "): " + event.message);  
    }  
    

    onerror 方法也需要绑定一个回调函数。当 Worker脚本 无法顺利执行时,就会触发 error事件 ,执行绑定的回调函数。

    terminate

    worker.terminate(); 

    terminate方法,可以用来停止当前运行的 Worker脚本:


    在 Worker脚本 中,原理大致和页面中的 worker对象 一样。

    可以通过 onmessage 接收页面传递的数据,并且执行绑定的函数。

    也可以通过 postMessage 来向页面传递数据。

    不过不同的是,在 Worker脚本 内部想终止执行,代码如下:

    self.close(); 
    

    当然,还可以往Worker脚本中注入js文件:

    importScript("task1.js", "task2.js", "task3.js"); 
    

    代码的执行顺序:task1.js -> task2.js -> task3.js

     

     

    更多相关资料:https://developer.mozilla.org/en/Using_web_workers

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    剑指offer——二叉树的深度
    剑指offer——约瑟夫环
    剑指offer——矩阵中的路径
    剑指offer——机器人的运动范围
    Java一些知识
    剑指offer——判断链表中是否有环
    无序数组array, 找到数组中两个数的最大差值
    剑指offer——二叉搜索树的第k个节点
    记录结果再利用的"动态规划"之背包问题
    倍增算法
  • 原文地址:https://www.cnblogs.com/maplejan/p/2774110.html
Copyright © 2011-2022 走看看