Pushlet的Ajax-pushlet-client.js分析

Ajax-pushlet-client是pushlet的ajax客戶端方式,對該JS進行分析後發現,它是採用了面向對象的javascript技術和充分利用XMLHttpRequest對象來實現的HTTP長連接,達到了服務器“推”技術。

1、屬性
NV_P_FORMAT: ‘p_format=xml-strict’,//數據格式,默認是嚴格嚴格XML
NV_P_MODE: ‘p_mode=pull’, //pushlet採用的模式,默認爲pull模式
pushletURL: null,//請求URL地址
webRoot: null,//項目根路徑
sessionId: null,//sessionId
STATE_ERROR: -2,//一些狀態常量
STATE_ABORT: -1,
STATE_NULL: 1,
STATE_READY: 2,
STATE_JOINED: 3,
STATE_LISTENING: 3,
state: 1,//狀態

statusMsg: ‘null’, //狀態消息
statusChanged: false,//狀態是否發生了改變
statusChar: ‘|’,//狀態分隔符

2、方法
_init:獲取XMLHttpRequest對象
設定pushlet的請求URL
將狀態置爲STATE_READY.

_doRequest (anEvent, aQuery):首先判斷是不是出現錯誤,然後再判斷是否需要等待狀態,若不需要等待則構建查詢字符串。最後調用_getXML(url, PL._onResponse)方法向服務器發出請求,後一個參數爲回調方法。

_getWebRoot:獲取項目根目錄,可以根據實際項目修改

_getXML:以get方式請求URL,用同步或者異步方式

_onResponse(xml):先將xml轉變爲pushlet事件對象(_rsp2Events),得到多個PushletEvent對象,再調用_onEvent()處理每個事件。

_rsp2Events(xml):取得事件標籤(event),然後調用PushletEvent(),可能得到多個PushletEvent對象。

_onEvent(event):處理由服務器端傳來的事件,首先判斷事件類型,由不同的類型調用不同的處理方法:
Data:調用_doCallback(event, window.onData),方法處理。onData是自定義;
Refresh:從event中取得刷新時間,然後調用_doRequest(‘refresh’)刷新;
Error:將state置爲STATE_ERROR,獲取錯誤原因,調用_doCallback(event, window.onError);
join-ack:將狀態置爲” STATE_JOINED”,取得sessionId,調用_doCallback(event, window.onJoinAck);
join-listen-ack:將state設爲STATE_LISTENING,取得sessionId,調用_doCallback(event, window.onJoinListenAck);
listen-ack、hb、hb-ack、leave-ack、refresh-ack、subscribe-ack、unsubscribe-ack、abort、/nack$/等類型也類似。

_addEvent(elm, evType, callback, useCapture):取得elm對象,調用以下三者之一:
obj.addEventListener(evType, callback, useCapture);
obj.attachEvent(‘on’ + evType, callback);
obj[‘on’ + evType] = callback。
當ajax-pushlet-client.js初始化時調用了該方法:PL._addEvent(window, ‘load’, PL._init, false);即初始化時相當於:window.onload=PL._init();

_doCallback(event,cbFunction):如果指定了回調方法,則調用cbFunction(event),如果沒有指定那麼調用window.onEvent(event)。

_getObject(obj):獲取對象引用,若參數爲對象直接返回該對象引用,若爲字符串則按ID取得該對象。

PushletEvent(XML):與nl.justobjects.pushlet.Event相對應。其內部方法或屬性如下:
Arr:數組,用於存放鏈值對;
getSubject():取得p_subject標籤值;
getEvent():取得p_event標籤值;
put(name, value);將鏈值對放入arr中;
get(name):按鏈取得值;
toString:轉換爲鏈值對字符串;
toTable:轉換爲表格;

將傳入xml解析到arr中。

其對外公開方法:
heartbeat():實質是調用了PL._doRequest(‘hb’),向後臺請求“hb”事件。再被封裝成了:p_heartbeat()精簡方式。
相似的方法還有:
Join:_doRequest(‘join’, PL.NV_P_FORMAT + ‘&’ + PL.NV_P_MODE);
joinListen:PL._doRequest(‘join-listen’, query);請求加入同時監聽;
leave:_doRequest(‘leave’);
listen(aSubject):_doRequest(‘listen’, query);按主題監聽;
publish(aSubject, theQueryArgs):_doRequest(‘publish’, query);按主題發佈;
subscribe(aSubject, aLabel):_doRequest(‘subscribe’, query);按主題訂閱;
unsubscribe(aSubscriptionId):_doRequest(‘unsubscribe’, query);按訂閱ID退訂;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章