javascript - 网络 worker - 他们是如何工作的?

标签 javascript html web-worker

我正在努力理解 this example :

HTML(主要代码):

   <html>  
     <title>Test threads fibonacci</title>  
     <body>  

     <div id="result"></div>  

     <script language="javascript">  

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

       worker.onmessage = function(event) {  
         document.getElementById("result").textContent = event.data;  
         dump("Got: " + event.data + "\n");  
       };  

       worker.onerror = function(error) {  
         dump("Worker error: " + error.message + "\n");  
         throw error;  
       };  

       worker.postMessage("5");  

     </script>  
     </body>  
   </html> 

Javascript(工作代码):

   var results = [];  

   function resultReceiver(event) {  
     results.push(parseInt(event.data));  
     if (results.length == 2) {  
       postMessage(results[0] + results[1]);  
     }  
   }  

   function errorReceiver(event) {  
     throw event.data;  
   }  

   onmessage = function(event) {  
     var n = parseInt(event.data);  

     if (n == 0 || n == 1) {  
       postMessage(n);  
       return;  
     }  

     for (var i = 1; i <= 2; i++) {  
       var worker = new Worker("fibonacci.js");  
       worker.onmessage = resultReceiver;  
       worker.onerror = errorReceiver;  
       worker.postMessage(n - i);  
     }  
  };  

我有以下问题:

  • worker 代码什么时候开始运行? var worker = new Worker("fibonacci.js"); 执行后立即 ?

  • worker 代码中的 onmessage = function(event) { ... } 赋值是否会在 worker.postMessage("5"); 在主代码中 ?

  • worker 代码可以访问在主代码(如 worker)中定义的全局变量吗?

  • 主代码能否访问工作代码中定义的全局变量(如 results)?

  • 在我看来,主代码中的 worker.onmessage = function(event) {...}onmessage = function(event) { ...} 在 worker 代码中(这是 worker 的 onmessage 事件处理程序)。我哪里错了?它们有什么区别?

  • 这段代码实际上应该做什么?当我运行它时 here它只打印“5”。这是它应该做的,还是我遗漏了什么?

非常感谢!

最佳答案

查看 HTML5 Rocks: The Basics of Web Workers用于一般教程。

  • 只要您调用worker的postMessage方法,Workers就会启动。
  • 主代码中worker的onmessage绑定(bind)的函数会在worker调用postMessage时起作用。
  • 全局变量不在主线程和工作线程之间共享。传递数据的唯一方法是通过 postMessage 进行消息传递。
  • 如您所料,worker 和 main 代码上的 onmessage 具有相同的含义。它是线程收到消息事件时的事件处理程序。您甚至可以使用 addEventListener 来捕获 message 事件:

主要代码:

function showResult(event) {  
   document.getElementById("result").textContent = event.data;  
   dump("Got: " + event.data + "\n");  
}
var worker = new Worker("fibonacci.js");
worker.addEventListener('message', showResult, false);

worker 代码:

addEventListener('message', resultReceiver, false);

您采用的斐波那契示例是一个递归 worker 示例。如果不使用 worker ,它会是这样的:

function fibonacci(n) {
    if (n == 0 || n == 1) return n;
    return fibonacci(n-1) + fibonacci(n-2);
}

var result = fibonacci(5);
dump("Got: " + result + "\n");

(哦不,我不会为你做一个stackless。你自己写!)

关于javascript - 网络 worker - 他们是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2896480/

相关文章:

javascript - 如果未通过客户端验证,则阻止 HTML 表单进行 POSTing

jquery - HTML Web Worker 和 Jquery Ajax 调用

javascript - 动态插入的 JQuery Mobile slider

javascript - 为什么 Typescript 不要求我的函数返回某种类型?

javascript - 如何创建一个新的 gsheet 并其中已有脚本?

javascript - 有什么方法可以在 webworker 中加载类,而不仅仅是普通的 javascript 文件吗?

javascript - 在 web worker 中注册事件监听器

javascript - 我们如何使用 ember-cli 对模型混合进行单元测试

javascript - React 未触发内部按钮 onClick 事件

javascript - 延迟加载图像,但使用 img 元素的标准语法