首頁 > web前端 > js教程 > 主體

AJAX請求佇列的使用詳解

php中世界最好的语言
發布: 2018-04-25 15:48:44
原創
1393 人瀏覽過

這次帶給大家AJAX請求隊列的使用詳解,使用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();   //要求执行队列中的请求
  }
}
登入後複製

我相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

JSONP實作原理與案例詳解

#jQuery json做出Ajax呼叫功能(附程式碼)

#

以上是AJAX請求佇列的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!