我想实现网络 worker 之间的交流。我阅读了W3C文档,发现 MessageChannel 是做到这一点的方法之一,但是在阅读MessageChannel时,我不明白如何在使用MessageChannel的工作人员之间实现通信。
我是从MSDN获得的
http://msdn.microsoft.com/en-in/library/ie/hh673525(v=vs.85).aspx
这里也没有适当的文档来做到这一点。
我需要知道,如何使用MessageChannel与网络 worker 交流?
这是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("");
})
和 worker
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);
}
最佳答案
这是一个纯JavaScript的干净示例,介绍如何在两个工作程序之间进行设置:
在主线程中:
function setup(){
var channel = new MessageChannel();
var worker1 = new Worker("worker1.js");
var worker2 = new Worker("worker2.js");
// Setup the connection: Port 1 is for worker 1
worker1.postMessage({
command : "connect",
},[ channel.port1 ]);
// Setup the connection: Port 2 is for worker 2
worker2.postMessage({
command : "connect",
},[ channel.port2 ]);
worker1.postMessage({
command: "forward",
message: "this message is forwarded to worker 2"
});
}
在
worker1.js
中:var worker2port;
var onMessageFromWorker2 = function( event ){
console.log("Worker 1 received a message from worker 2: " + event.data);
//To send something back to worker 2
//worker2port.postMessage("");
};
self.onmessage = function( event ) {
switch( event.data.command )
{
// Setup connection to worker 2
case "connect":
worker2port = event.ports[0];
worker2port.onmessage = onMessageFromWorker2;
break;
// Forward messages to worker 2
case "forward":
// Forward messages to worker 2
worker2port.postMessage( event.data.message );
break;
//handle other messages from main
default:
console.log( event.data );
}
};
用
worker2.js
var worker1port;
var onMessageFromWorker1 = function( event ){
console.log("Worker 2 received a message from worker 1: " + event.data);
//To send something back to worker 1
//worker1port.postMessage("");
};
self.onmessage = function( event ) {
switch( event.data.command )
{
// Setup connection to worker 1
case "connect":
worker1port = event.ports[0];
worker1port.onmessage = onMessageFromWorker1;
break;
// Forward messages to worker 1
case "forward":
// Forward messages to worker 1
worker1port.postMessage( event.data.message );
break;
//handle other messages from main
default:
console.log( event.data );
}
};
这显示了如何处理来自主线程的消息,如何将消息从主线程转发到其他工作线程,以及如何在不涉及主线程的情况下直接在工作线程之间进行通信。