我想实现webworker之间的通信。我阅读了W3C文档,我发现MessageChannel是实现它的方法之一,但在阅读MessageChannel时,我无法理解如何使用MessageChannel实现worker之间的通信。
我从MSDN得到这个
http://msdn.microsoft.com/en-in/library/ie/hh673525(v=vs.85).aspx
这里也没有合适的文档来做这件事。
我需要知道,如何使用MessageChannel与Web工作者进行沟通?
下面是Demo抛出的DATA_CLONE_ERR
var worker = new Worker("sub1_worker.js");
worker.onmessage = function(e) {
$("#log").append("<br>" + e.data);
}
var channel = new MessageChannel();
worker.postMessage("ping", [channel.port2]);
channel.port1.onmessage = function(event) {
// Message is in event.data
alert("Message is: " + event.data);
}
channel.port1.postMessage('hello');
$("#send1").click(function() {
var msg = $("#msg").val();
if (msg && msg != "start")
worker.postMessage("ping2");
$("#msg").val("");
})
$("#send2").click(function() {
var msg = $("#msg").val();
if (msg && msg != "start")
worker.postMessage("ping3",[channel.port2]);
$("#msg").val("");
})
和工人
onmessage = getMessage;
function getMessage(e){
if(e.ports[0])
e.ports[0].postMessage("msg from sub worker 1 "+ e.data);
else
postMessage("msg from sub worker 1 "+ e.data);
}
3条答案
按热度按时间dgsult0t1#
这里有一个纯JavaScript的干净例子,说明如何在两个工作者之间设置它:
在主线程中:
在
worker1.js
中:单位:
worker2.js
这展示了如何处理来自主线程的消息,如何将消息从主线程转发到其他工作线程,以及如何在不涉及主线程的情况下直接在工作线程之间进行通信。
cygmwpex2#
你的演示真的很适合我(Chrome 23.0.1271.101).如果我点击第二个“send to subworker”按钮,我只会得到DATA_CLONE_ERR.这可能是预期的.您已经在创建通道后通过第一个
postMessage
调用将MessageChannel
的port2
发送给了worker.再次发送可能是非法的,虽然我也找不到任何关于这方面的明确文档。您可能需要在worker中接收的端口上设置
onmessage
,然后您可以处理将来通过该端口发送的消息。类似于:c3frrgcw3#
在MessageChannel API上工作了一段时间后。我得到了使用MessageChannel与webworker通信的解决方案。这里是一个Demo of working code.