AJAX 請求隊列實現

AJAX在使用的過程中會遇到一個問題,當用戶短時間內執行了多個異步請求的時候,如果前一個請求沒完成,將會被取消執行最新的一個請求,大多數情況下,不會有什麼影響,例如請求了一個新的列表,舊的請求也就沒什麼必要了 ,但是,當我們的WEB程序需要同時異步調用多個請求,或者需要用戶請求的是不同類型的數據,都需要執行完成的時候就出現問題 了,於是,將用戶的請求記錄下來,並按順序執行。

 

不同的瀏覽器,允許同時執行的線程不同,通常IE允許兩個線程,於是,當同時執行的異步請求超過兩個時,就會變成只執行最新的兩個。

 

AJAX隊列很簡單,創建一個數組存儲請求隊列,數組中每一項又是一個請求參數數組,當用戶執行請求時,不是直接執行AJAX,首先將參數作爲一個數組作爲項再存入隊列,檢查隊列中是否存在多個請求,如果沒有,直接執行當前隊列中這唯一的一項,如果有則不執行(因爲有其他項,說明隊列還在執行中,不必着急,其他項執行完了會輪到這一項的),AJAX執行完成後就刪除當前執行的隊列項,然後再檢查數組還有沒有請求,有就繼續執行到所有請求都完成爲止,以下是我構建的一個隊列,AJAX部分是之前封裝的。

 

//Ajax Function

 

var reqObj; //Creat Null Instence

 

var RequestArray = new Array();

//var whichRequest;

 

//加入請求隊列

function AddRequestArray(url,isAsy,method,parStr,callBackFun)

{

 

        var ArgItem = new Array();

 

        ArgItem[0]=url;

        ArgItem[1]=isAsy;

        ArgItem[2]=method;

        ArgItem[3]=parStr;

        ArgItem[4]=callBackFun;

 

        RequestArray.push(ArgItem);     //將當前請求添加到隊列末尾

       

       

       

        if(RequestArray.length==1)  //如果請求隊列裏只有當前請求立即要求執行隊列,如果有其他請求,那麼就不要求執行隊列

        {

            ExeRequestArray();

        }

}

 

//執行隊列裏的順序第一個的請求

function ExeRequestArray()

{

 

    if( RequestArray.length>0)  //如果隊列裏有請求執行 AJAX請求

    {

        var ArgItem = RequestArray[0];

 

        DoRequest(ArgItem[0],ArgItem[1],ArgItem[2],ArgItem[3],ArgItem[4]);

    }

}

 

 

//Run Ajax (string urladdress,bool IsAsy,string method,string parameters,string whichRequest)

function DoRequest(url,isAsy,method,parStr,callBackFun) 

{

 

    reqObj = false;

   

    //whichRequest = whichReq;

 

    if (window.XMLHttpRequest) //compatible Mozilla, Safari,...

    {

       

        reqObj = new XMLHttpRequest();              //Creat XMLHttpRequest Instance

       

        if (reqObj.overrideMimeType)                //if Mime Type is false ,then set MimeType 'text/xml'

        {

            reqObj.overrideMimeType('text/xml');

        }

   

    }

   

    else if (window.ActiveXObject) //compatible IE

    {

   

        try

        {

            reqObj = new ActiveXObject("Msxml2.XMLHTTP");  //Creat XMLHttpRequest Instance

        }

        catch (e)

        {

            try

            {

                reqObj = new ActiveXObject("Microsoft.XMLHTTP");  //Creat XMLHttpRequest Instance

            }

            catch (e)

            {}

        }

   

    }

 

    //if reqObj is false,then alert warnning

    if (!reqObj)

    {

       

        alert('Giving up :( Cannot create an XMLHTTP instance');

        return false;

   

    }

   

   

   

   

    reqObj.onreadystatechange = function(){GetRequest(callBackFun)}; //set onreadystatechange Function

   

    reqObj.open(method, url, isAsy);        //set open Function

   

    reqObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); //set RequestHeader

   

    reqObj.send(parStr);   //do send and send parameters

 

}

 

 

//get Service Response information Function

function GetRequest(callBackFun)

{

 

   

 

    //judge readystate information

    if (reqObj.readyState == 4)

    {

        //judge status information

        if (reqObj.status == 200)

        {

            eval(callBackFun+"(reqObj)");

 

        }

        else

        {

            alert('There was a problem with the request.'+reqObj.status+"CallFunction:"+callBackFun); //else alert warnning

        }

  

        RequestArray.shift();  //移除隊列裏的順序第一個的請求,即當前已經執行完成的請求

        ExeRequestArray();      //要求執行隊列中的請求

 

    }

 

}

 

 

        

 

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