#onmessage和#postmessage如何在主线程和HTML5的webworkers之间进行通信?

时间:2016-07-22 17:48:01

标签: javascript html html5 multithreading web-worker

我正在学习来自here的HTML5工作者,并且作者使用self.onmessageself.postmessage在主线程和工作者之间进行通信“因为工作者无法访问DOM。”但在下面,似乎self指的是主线程和工作者。

function CalculatePi(loop)
{
    var c = parseInt(loop);
    var f = parseFloat(loop);
    var n=1;

    //these errors will need more work…
    if (isNaN(c) || f != c ) {
      throw("errInvalidNumber");
    } else if (c<=0) {
      throw("errNegativeNumber");
    }

    for (var i=0,Pi=0;i<=c;i++) {
      Pi=Pi+(4/n)-(4/(n+2));
      n=n+4;
    }
    self.postMessage({'PiValue': Pi});
}
//wait for the start 'CalculatePi' message
//e is the event and e.data contains the JSON object
self.onmessage = function(e) {
  CalculatePi(e.data.value);
}

上面的代码来自一个包含worker的单独的js文件,我知道self中的self.onmessage是指工作者从主线程接收消息以开始计算,但为什么它会使用self.postMessage将消息发回给自己吗? #postMessage和#onmessage的默认收据是否包括主线程和工作者?

后来,作者通过这个函数发布了pi的calucation:

worker.onmessage = function(e) {
  document.getElementById("PiValue").innerHTML = e.data.PiValue;
};

当工作者不想访问DOM时,这是如何工作的?它显然在这里使用document.getElementById。

1 个答案:

答案 0 :(得分:2)

在您的文件worker.js中将self.postMessage视为工作者(自己)应该发布消息的顺序/指令。因为它只能与创建它的mainJS进行通信,所以这条消息就在那里。 :) 同样在你的mainJS worker.onmessage中应该被理解为“来自工人的消息”。

所以基本上你在两个脚本中都有两个选项: 在mainJS中:worker.postMessage("message");向工作人员发送消息 - worker.onmessage = function(event){...}收听来自工作人员的消息

工作脚本中的

(self or) this.onmessage = function(event){...}收听来自mainJS的消息 - 以及self.postMessage("message");将某些内容发送回mainJS