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退订;

你可能感兴趣的:(Pushlet)