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

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/maplejan/p/2774110.html
Copyright © 2011-2022 走看看