ホームページ  >  記事  >  ウェブフロントエンド  >  AJAXリクエストキューの実装

AJAXリクエストキューの実装

亚连
亚连オリジナル
2018-05-23 11:11:562562ブラウズ

この記事では主に AJAX リクエストキューの実装コードを詳しく紹介します。興味のある方は参考にしてください。

AJAX は、ユーザーが短期間に複数の非同期リクエストを使用するときに問題が発生します。前のリクエストが完了していない場合、ほとんどの場合、新しいリストがリクエストされた場合、古いリクエストもキャンセルされます。ただし、WEB プログラムが複数のリクエストを同時に非同期で呼び出す必要がある場合、またはユーザーが異なる種類のデータをリクエストし、すべてを実行する必要がある場合に問題が発生します。そのため、ユーザーのリクエストは に記録され、実行されます。注文。

異なるブラウザでは異なるスレッドの同時実行が許可されます。そのため、同時に 3 つ以上の非同期リクエストが実行される場合、最新の 2 つのスレッドのみが実行されます。

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();   //要求执行队列中的请求
  }
}

以上、皆様の参考になれば幸いです。

関連記事:

ajaxを使ってフォームを非同期送信するいくつかの方法まとめ

AJAXリクエストの配列の問題を解決する方法

Ajaxリクエストとフィルター連携事例分析

以上がAJAXリクエストキューの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。