<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 5, comments - 16, trackbacks - 0, articles - 0
    在網(wǎng)上看到了有些同志提到了為Ajax的XMLHttpRequest提供一個對象池,也讀了他們給出的實現(xiàn)代碼。感覺不是特別理想,于是模仿apache的commons中的ObjectPool的思路寫了一個簡單的JavaScript版。望指教:
    function ?ObjectPool(poolableObjectFactory)? {
    ????
    this ._poolableObjectFactory? =
    ?poolableObjectFactory;
    ????
    this ._idlePool? =
    ?[];?
    ????
    this ._activePool? =
    ?[];?
    }


    // ?從對象池中租借一個對象,如果目前沒有可用的空閑對象則通過poolableObjectFactory創(chuàng)建一個
    //
    ?既然是借的,用完記得一定要還哦!
    ObjectPool.prototype.borrowObject? = ? function ()? {
    ????
    var ?object? = ? null
    ;
    ????
    var ?idlePool? = ? this
    ._idlePool;
    ????
    var ?factory? = ? this
    ._poolableObjectFactory;
    ????
    if ?(idlePool.length? > ? 0 )?
    {
    ????????object?
    =
    ?idlePool.pop();
    ????}

    ????
    else ? {
    ????????object?
    =
    ?factory.makeObject();
    ????}

    ????
    if ?(object? != ? null )? {
    ????????
    this
    ._activePool.push(object);
    ????????
    if ?(factory.activateObject)?
    {
    ????????????factory.activateObject(object);
    ????????}

    ????}

    ????
    return ?object;
    }


    // ?歸還一個對象
    ObjectPool.prototype.returnObject? = ? function (object)? {
    ????
    function ?indexOf(array,?object)?
    {
    ????????
    for ?( var ?i? = ? 0 ;?i? < ?array.length;?i ++ )?
    {
    ????????????
    if ?(array[i]? == ?object)? return
    ?i;
    ????????}

    ????????
    return ? - 1 ;
    ????}

    ????
    if ?(object? != ? null )? {
    ????????
    var ?activePool? = ? this
    ._activePool;
    ????????
    var ?factory? = ? this
    ._poolableObjectFactory;????????
    ????????
    var ?i? =
    ?indexOf(activePool,?object);
    ????????
    if ?(i? < ? 0 )? return
    ;????????
    ????????
    if ?(factory.passivateObject)?
    {
    ????????????factory.passivateObject(object);
    ????????}
    ????????
    ????????activePool.splice(i,?
    1
    );
    ????????
    this
    ._idlePool.push(object);
    ????}

    }


    // ?返回當前激活對象的個數(shù)
    ObjectPool.prototype.getNumActive? = ? function ()? {
    ????
    return ? this
    ._activePool.length;
    }


    // ?返回當前空閑對象的個數(shù)
    ObjectPool.prototype.getNumIdle? = ? function ()? {
    ????
    return ? this
    ._idlePool.length;
    }


    // ?銷毀對象池及其中的所有對象
    //
    ?如果對象池中的對象需要析構(gòu)。那么必須實現(xiàn)poolableObjectFactory中的destroyObject方法,同時保證ObjectPool的destroy方法在需要的時候被調(diào)用到(例如Window的unload事件中)。
    ObjectPool.prototype.destroy? = ? function ()? {
    ????
    var ?factory? = ? this
    ._poolableObjectFactory;
    ????
    function ?returnObject(object)?
    {
    ????????
    if ?(factory.passivateObject)?
    {
    ????????????factory.passivateObject(object);
    ????????}

    ????}

    ????
    function ?destroyObject(object)? {
    ????????
    if ?(factory.destroyObject)?
    {
    ????????????factory.destroyObject(object);
    ????????}

    ????}

    ????
    ????
    var ?activePool? = ? this ._activePool;
    ????
    for ?( var ?i? = ? 0 ;?i? < ?activePool.length;?i ++ )?
    {
    ????????
    var ?object? =
    ?activePool[i];
    ????????returnObject(object);
    ????????destroyObject(object);
    ????}

    ????
    var ?idlePool? = ? this ._idlePool;
    ????
    for ?( var ?i? = ? 0 ;?i? < ?idlePool.length;?i ++ )?
    {
    ????????
    var ?object? =
    ?idlePool[i];
    ????????destroyObject(object);
    ????}

    ????
    this ._idlePool? = ? null ;?
    ????
    this ._activePool? = ? null
    ;?
    ????
    this ._poolableObjectFactory? = ? null
    ;
    }

    上面代碼中ObjectPool的構(gòu)造參數(shù)poolableObjectFactory的聲明如下:
    // ?注意:?這只是說明,不是真正的代碼!
    var ?PoolableObjectFactory? = ? {????????
    ????makeObject:?
    function ()? {} ,? // ?創(chuàng)建一個新的對象。(必須聲明)????

    ????
    ????activateObject:?
    function (object)? {} ,? // ?當一個對象被激活時(即被借出時)觸發(fā)的方法。(可選)

    ????
    ????passivateObject:?
    function (object)? {} ,? // ?當一個對象被鈍化時(即被歸還時)觸發(fā)的方法。(可選)

    ????
    ????destroyObject:?
    function (object)? {} ? // ?銷毀一個對象。(可選)????????

    }
    ;

    結(jié)合XMLHttpRequest創(chuàng)建過程的簡陋示例:
    // ?聲明XMLHttpRequest的創(chuàng)建工廠
    var ?factory? = ? {????????
    ????makeObject:?
    function ()?
    {
    ????????
    // ?創(chuàng)建XMLHttpRequset對象

    ???????? if ?(window.ActiveXObject) {
    ????????????
    return ? new ?ActiveXObject( " Microsoft.XMLHTTP "
    );
    ????????}

    ????????
    else ? {
    ????????????
    return ? new
    ?XMLHttpRequest();
    ????????}

    ????}
    ,
    ????????????
    ????passivateObject:?
    function (xhr)?
    {
    ????????
    // ?重置XMLHttpRequset對象

    ????????xhr.onreadystatechange? = ? {} ;
    ????????xhr.abort();
    ????}

    }
    ;

    var ?pool? = ? new ?ObjectPool(factory);? // ?創(chuàng)建對象池

    //
    ?
    var ?xhr? = ?pool.borrowObject();? // ?獲得一個XMLHttpRequest對象
    xhr.onreadystatechange? = ? function ()? {
    ????
    if ?(xhr.readyState? == ? 4 )?
    {
    ????????
    // ?

    ????????pool.returnObject(xhr);? // ?歸還XMLHttpRequest對象
    ????}

    }
    ;
    xhr.open(method,?url,?
    true
    );
    // ?

    最后附上jsUnit的測試用例:
    function ?test_pool()? {
    ????
    var ?factory? = ?
    {
    ????????counter:?
    0
    ,
    ????????
    ????????makeObject:?
    function ()?
    {
    ????????????
    return ? {id:? ++ ? this .counter}
    ;????????????
    ????????}
    ,????????
    ????????
    ????????activateObject:?
    function (object)?
    {
    ????????????object.activated?
    = ? true
    ;
    ????????}
    ,
    ????????
    ????????passivateObject:?
    function (object)?
    {
    ????????????object.activated?
    = ? false
    ;????????????
    ????????}
    ,
    ????????
    ????????destroyObject:?
    function (object)?
    {
    ????????????object.destroyed?
    = ? true
    ;????????????
    ????????}

    ????}
    ;
    ????
    ????
    var ?pool? = ? new
    ?ObjectPool(factory);
    ????
    ????
    // ?borrowObject?object1

    ???? var ?object1? = ?pool.borrowObject();
    ????assertEquals(object1.id,?
    1
    );
    ????assertTrue(object1.activated);
    ????assertEquals(factory.counter,?
    1
    );
    ????assertEquals(pool.getNumActive(),?
    1
    );
    ????assertEquals(pool.getNumIdle(),?
    0
    );
    ????
    ????
    // ?borrowObject?object2

    ???? var ?object2? = ?pool.borrowObject();
    ????assertEquals(object2.id,?
    2
    );
    ????assertTrue(object2.activated);
    ????assertEquals(factory.counter,?
    2
    );
    ????assertEquals(pool.getNumActive(),?
    2
    );
    ????assertEquals(pool.getNumIdle(),?
    0
    );
    ????
    ????
    // ?borrowObject?object3

    ???? var ?object3? = ?pool.borrowObject();
    ????assertEquals(object3.id,?
    3
    );
    ????assertTrue(object3.activated);
    ????assertEquals(factory.counter,?
    3
    );
    ????assertEquals(pool.getNumActive(),?
    3
    );
    ????assertEquals(pool.getNumIdle(),?
    0
    );
    ????
    ????
    // ?returnObject?object2

    ????pool.returnObject(object2);
    ????assertFalse(object2.activated);
    ????assertEquals(factory.counter,?
    3
    );
    ????assertEquals(pool.getNumActive(),?
    2
    );
    ????assertEquals(pool.getNumIdle(),?
    1
    );
    ????
    ????
    // ?returnObject?object3

    ????pool.returnObject(object3);
    ????assertFalse(object3.activated);
    ????assertEquals(pool.getNumActive(),?
    1
    );
    ????assertEquals(pool.getNumIdle(),?
    2
    );
    ????
    ????
    // ?returnObject?object1

    ????pool.returnObject(object1);
    ????assertFalse(object1.activated);
    ????assertEquals(pool.getNumActive(),?
    0
    );
    ????assertEquals(pool.getNumIdle(),?
    3
    );
    ????
    ????
    // ?destroy?the?pool

    ????pool.destroy();
    ????assertTrue(object1.destroyed);
    ????assertTrue(object2.destroyed);
    ????assertTrue(object3.destroyed);
    }

    下載: http://www.tkk7.com/Files/bennybao/pool.rar

    Feedback

    # re: 為Ajax的XMLHttpRequest提供對象池(模仿Apache中ObjectPool的實現(xiàn))  回復  更多評論   

    2007-02-10 01:46 by ghf

    # re: 為Ajax的XMLHttpRequest提供對象池(模仿Apache中ObjectPool的實現(xiàn))  回復  更多評論   

    2007-02-16 11:18 by 張沈鵬
    為什么要一個activePool ,沒有什么用處呀,用完了直接push進入idle,用的時候直接從idle中pop,同時把xmlrequest封裝一下,讓他自動來pop和push,用只要給出url和recall就可以了

    我的郵箱是zsp007@gmail.com歡迎探討
    __reqPool={
    idle:[],
    new:function(){
    var r=this.idle.pop();
    if(!r){
    if (window.XMLHttpRequest)r=new XMLHttpRequest();
    else{
    try{r=new ActiveXObject("Msxml2.XMLHTTP");}
    catch(e){r=new ActiveXObject("Microsoft.XMLHTTP");}
    }
    }
    return r;
    }
    open:function(url,recall,error){
    var http=this.new();
    http.open("GET",url,true);
    http.onreadystatechange=function(){
    if(http.readyState==4)
    {
    if(http.status==200)recall(http.responseText.toString());
    else if(error) error(http.status,http.responseText.toString());
    idle.push(http);
    }
    };

    }
    }


    # re: 為Ajax的XMLHttpRequest提供對象池(模仿Apache中ObjectPool的實現(xiàn))[未登錄]  回復  更多評論   

    2007-02-16 13:57 by BennyBao
    @張沈鵬
    activePool確實不是必須的,但是有了activePool之后就可以很方便的知道究竟有多少已激活的Object,或者可以利用一個類似“守護線程”的定時器來監(jiān)控每個Object的激活時間,以便與實現(xiàn)類似超時之類的功能。
    另外需要說明的是,根據(jù)我的本意,這里的ObjectPool并不只為XMLHttp設計。
    主站蜘蛛池模板: 成年美女黄网站18禁免费| 亚洲综合激情另类专区| 中文在线观看国语高清免费| 亚洲一区二区免费视频| 亚洲av鲁丝一区二区三区| 免费在线观看黄网站| 毛片免费视频播放| 最近最新高清免费中文字幕| 国产vA免费精品高清在线观看| 亚洲欧美综合精品成人导航| 亚洲码一区二区三区| 亚洲AV永久无码区成人网站| 亚洲第一网站男人都懂| 国产男女猛烈无遮挡免费视频网站| 91精品免费国产高清在线| 性色午夜视频免费男人的天堂| 一个人看的免费高清视频日本| 亚洲AV成人一区二区三区观看| 久久精品国产亚洲AV忘忧草18| 91亚洲精品第一综合不卡播放| 国产日韩亚洲大尺度高清| 亚洲国产精品激情在线观看| 国产jizzjizz免费看jizz| 好吊妞788免费视频播放| 国产精品视频免费一区二区| 久久经典免费视频| 国产四虎免费精品视频| 2019中文字幕在线电影免费 | 国内精品一级毛片免费看| 国产99久久久国产精免费| 曰韩无码AV片免费播放不卡 | 国产自偷亚洲精品页65页| 亚洲精品国产va在线观看蜜芽| 亚洲精品乱码久久久久久蜜桃| 亚洲av成人一区二区三区在线观看| 暖暖免费高清日本一区二区三区| 四色在线精品免费观看| 最近免费中文字幕4| 日韩一级在线播放免费观看| 全部免费国产潢色一级| 亚洲精品久久久www|