亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1318 | 回復(fù): 0
打印 上一主題 下一主題

JavaScript對象間基于Message的同步/異步通信(二) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-19 14:02 |只看該作者 |倒序瀏覽

三、 數(shù)據(jù)結(jié)構(gòu)

1、 Message的格式

     Messenger系統(tǒng)里最重要的數(shù)據(jù)結(jié)構(gòu)自然是message本身。一直在考慮是否有必要為Message定義一個接口,后來覺得也許用數(shù)組性能會更好,所以就直接使用一個數(shù)組來定義message的格式了?紤]到一般情況的應(yīng)用,這個 msg 數(shù)組包含5個元素,即 msg[0] 至 msg[4], 如圖:

具體的字段定義為:

     1. msg[0]: Priority, 數(shù)值類型, 調(diào)度系統(tǒng)會優(yōu)先調(diào)度緊急消息,僅當沒有緊急消息時,調(diào)度普通消息,工作于 post 模式,取值范圍(0,1), 0 表示緊急, 1 表示普通。

     2. msg[1]: Device, 字串類型, 窗口標識,Messenger系統(tǒng)支持在彈出窗口以及iframe的對象間的通信,本字段表示消息接收者位于哪個窗口或iframe。默認為 null,表示本窗口。

     3. msg[2]: [Recvs...], 數(shù)組類型, 消息接收者的id數(shù)組,消息發(fā)送者可以指定消息被某一個或某幾個特定的接收者接收。默認為 null,表示所有訂閱該消息的接收者都可以接收。

     4. msg[3]: MsgID, 字串類型, 消息種類的id, 對應(yīng) what。

     5. msg[4]: MsgData, 任意類型, 消息的內(nèi)容, 是通信雙方希望傳遞的實際內(nèi)容,由通信雙方約定具體類型。

2、 Registry的結(jié)構(gòu)

    Messenger是一個基于訂閱/發(fā)布模式(subscribe/publish)的實現(xiàn),自然要維護一個訂閱者的數(shù)據(jù)庫, 當然在具體的設(shè)計和實現(xiàn)中,不會也不必引入數(shù)據(jù)庫的概念,但如下的一個起碼的數(shù)據(jù)表是必需的。 
         

  這樣的一張表,在實現(xiàn)中,可以用下圖的數(shù)據(jù)結(jié)構(gòu)來具體實現(xiàn):



    在JavaScript,可以非常容易地實現(xiàn)上圖:

  1.         /**
  2.          * Define the EventQueue class based on subscribe/publish mode
  3.          */
  4.         js.awt.EventQueue = function(){
  5.             /**
  6.              * Registry of subscribtion
  7.              *
  8.              * key is "what"
  9.              * value is a list of the pair (who, where)
  10.              */
  11.              var R = {};
  12.              
  13.             /**
  14.              * Subscribe a message from EventQueue
  15.              *
  16.              * @param what, the message id
  17.              * @param who, the message listener
  18.              * @param where, the message handler
  19.              */
  20.              this.register = function(what, who, where){
  21.                  var recvs = R[what];
  22.                  if(recvs == null){
  23.                      recvs = [];
  24.                      R[what] = recvs;
  25.                  }

  26.                  recvs.push({listener:who, handler:where});

  27.              };
  28.         
  29.         }.$extend(ls.lang.Object);

3、 Message隊列的結(jié)構(gòu)

    這個Messenger系統(tǒng)最大的特點是支持異步消息遞送,即消息發(fā)送者調(diào)用post來發(fā)送消息。 所謂異步消息遞送分為兩個階段, 第一階段,消息發(fā)送者調(diào)用post方法,消息直接進入Messenger里的一個隊列中,post方法立即返回。 第二階段, Messenger的調(diào)度系統(tǒng)從消息隊列中取出一條消息分發(fā)給所有訂閱者。 
   考慮到可能會有消息優(yōu)先級的應(yīng)用需求,在這個Messenger系統(tǒng)里,采用一個簡單的方案來實現(xiàn)所謂的優(yōu)先級隊列,即雙隊列,一個放緊急消息,一個放普通消息。post消息時,根據(jù)消息優(yōu)先級放入不同的隊列,當調(diào)度系統(tǒng)分發(fā)消息時,僅當緊急隊列為空,才分發(fā)普通隊列的消息。 


    在JavaScript里實現(xiàn)這樣的一個隊列,可以是異常的簡單。

  1.         /**
  2.          * Define the EventQueue class based on subscribe/publish mode
  3.          */
  4.         js.awt.EventQueue = function(){
  5.             /**
  6.              * Message queue
  7.              *
  8.              * Q[0] for urgent message
  9.              * Q[1] for general message
  10.              */
  11.              var Q = [[],[]];

  12.              var _get = function(){
  13.                  var msg = Q[0].shift();
  14.                  msg = (msg == undefined) ? Q[1].shift() : msg;
  15.                  return msg;
  16.              };

  17.              var _put = function(msg){
  18.                  Q[msg[0]].push(msg);
  19.              };

  20.              /**
  21.               * Test whether the message queue is empty
  22.               */
  23.              this.isEmpty = function(){
  24.                  return (Q[0].length + Q[1].length) === 0;
  25.              };

  26.             /**
  27.              * Message sender use this method to post a message and
  28.              * return immediately
  29.              *
  30.              * @param msg
  31.              * +----------+----------+------------+----------+-------------+
  32.              * | PRI     | Device | [recvs..] | msgId | msgData |
  33.              * +----------+----------+------------+----------+-------------+
  34.              */
  35.             this.post = function(msg){
  36.                 _put(msg);
  37.             };

  38.             /**
  39.              * Schedule system use this method to dispatch a message to
  40.              * listeners
  41.              *
  42.              */
  43.             this.dispatch = function(){
  44.                 var msg = _get(), ex;
  45.                 if(msg == undefined) return;

  46.                 // TODO:
  47.                 
  48.             };
  49.             
  50.         
  51.         }.$extend(ls.lang.Object);
未完待續(xù)...
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP