消息通道可在两个 worker 之间提供单向数据传递链接。使用 MessageChannel 对象在 worker 之间传递数据具有一个主要优势。当使用消息通道发送消息(对象)时,MessageChannel 对象将调度
channelMessage
事件。接收 worker 中的代码可以侦听该事件以了解数据何时可用。这样,接收 worker 不需要持续检查数据更新。
消息通道仅与两个 worker 相关联,即发送器和接收器。要创建 MessageChannel 对象,请调用发送 Worker 对象的
createMessageChannel()
方法,将接收 worker 作为参数进行传递:
// In the sending worker swf
var sendChannel:MessageChannel;
sendChannel = Worker.current.createMessageChannel(receivingWorker);
两个 worker 均需有访问 MessageChannel 对象的权限。做这件事最简单的方法便是使用
setSharedProperty()
方法传递 MessageChannel 对象。
receivingWorker.setSharedProperty("incomingChannel", sendChannel);
在接收 worker 中,为 MessageChannel 对象的
channelMessage
事件注册一个侦听器。当发送 worker 通过消息通道发送数据时,将会对该事件进行调度。
// In the receiving worker swf
var incomingChannel:MessageChannel;
incomingChannel = Worker.current.getSharedProperty("incomingChannel");
incomingChannel.addEventListener(Event.CHANNEL_MESSAGE, handleIncomingMessage);
要实际发送数据,请在发送 worker 中调用 MessageChannel 对象的
send()
方法:
// In the sending worker swf
sendChannel.send("This is a message");
在接收 worker 中,MessageChannel 调用
channelMessage
事件处理函数。然后,接收 worker 可以通过调用 MessageChannel 对象的
receive()
方法来获取数据。
private function handleIncomingMessage(event:Event):void
{
var message:String = incomingChannel.receive() as String;
}
接收方法所返回的对象与传递到
send()
方法的对象具有相同的数据类型。接收到的对象是发送器所传入对象的副本而不是对发送 worker 中对象的引用,除非其是
共享引用和复制值
中所述的一些数据类型之一。