AJAX請求隊列實現_AJAX相關

來源:互聯網
上載者:User

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

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

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

//Ajax Functionvar reqObj; //Creat Null Instencevar 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 Functionfunction 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();   //要求執行隊列中的請求  }}

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.