訊息通道在兩個 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 中的物件參考,除非它是少數資料類型之一,如
共用的參考和複製的值
中所述。