我正在学习来自here的HTML5工作者,并且作者使用self.onmessage
和self.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。
答案 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