国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > AJAX > 正文

防止重復(fù)發(fā)送Ajax請(qǐng)求的方法

2024-09-01 08:30:29
字體:
供稿:網(wǎng)友

相信有很多小伙伴們都被AjAX重復(fù)發(fā)送的問題所困擾,那么我們要如何才能避免這一問題的發(fā)生呢?接下來的內(nèi)容中小編將為大家介紹防止重復(fù)發(fā)送Ajax請(qǐng)求的方法,一起來看看吧。

在頁面中有多個(gè)按鈕,點(diǎn)擊該按鈕可以異步的去服務(wù)端讀取數(shù)據(jù),然后在前端將數(shù)據(jù)展示出來。 每個(gè)按鈕點(diǎn)擊請(qǐng)求的頁面都是同一個(gè),但是請(qǐng)求的參數(shù)不同,所以返回的內(nèi)容就不同。 在連續(xù)點(diǎn)擊多個(gè)按鈕的時(shí)候就會(huì)發(fā)出多個(gè)異步請(qǐng)求。那么根據(jù)請(qǐng)求返回的快慢(因?yàn)椴煌粹o參數(shù)不同,返回內(nèi)容不同,所以會(huì)有快慢之分),數(shù)據(jù)會(huì)依次的展示出來,那么就會(huì)出現(xiàn)一個(gè)先點(diǎn)擊的按鈕,由于他請(qǐng)求的數(shù)據(jù)量比較大,導(dǎo)致數(shù)據(jù)被后顯示出來。

一、問題解決

解決這種問題有兩種方式:

  • 1.當(dāng)連續(xù)進(jìn)行多個(gè)請(qǐng)求,并且請(qǐng)求的url地址相同時(shí)。放棄前面的所有請(qǐng)求,只執(zhí)行最后一次請(qǐng)求。
  • 2.當(dāng)連續(xù)進(jìn)行多個(gè)請(qǐng)求,并且請(qǐng)求的url地址相同時(shí)。放棄后面的所有請(qǐng)求,只執(zhí)行第一次請(qǐng)求。

二、解決方案

1、將ajax請(qǐng)求的async設(shè)置為false

$.ajax({  async: false,  type : "POST",  url : defaultPostData.url,  dataType : 'json',  success : function(data) {  } }); 

async

  • 類型:Boolean
  • 默認(rèn)值: true。默認(rèn)設(shè)置下,所有請(qǐng)求均為異步請(qǐng)求。如果需要發(fā)送同步請(qǐng)求,請(qǐng)將此選項(xiàng)設(shè)置為 false。
  • 注意,同步請(qǐng)求將鎖住瀏覽器,用戶其它操作必須等待請(qǐng)求完成才可以執(zhí)行。

2、利用jquery ajaxPrefilter中斷請(qǐng)求

由于第一種方案只是一種曲線救國的方式,其實(shí)沒能真正的解決上面的問題。所以,建議使用這種方式。

 var pendingRequests = {}; $.ajaxPrefilter(function( options, originalOptions, jqXHR ) {  var key = options.url;  console.log(key);  if (!pendingRequests[key]) {   pendingRequests[key] = jqXHR;  }else{   //jqXHR.abort(); //放棄后觸發(fā)的提交   pendingRequests[key].abort(); // 放棄先觸發(fā)的提交  }  var complete = options.complete;  options.complete = function(jqXHR, textStatus) {   pendingRequests[key] = null;   if ($.isFunction(complete)) {   complete.apply(this, arguments);   }  }; });

Prefilters是一個(gè)預(yù)過濾器,在每個(gè)請(qǐng)求之前被發(fā)送和$.ajax()處理它們前處理。

  • options 是請(qǐng)求的選項(xiàng)
  • originalOptions 值作為提供給Ajax方法未經(jīng)修改的選項(xiàng),因此,沒有ajaxSettings設(shè)置中的默認(rèn)值
  • jqXHR 是請(qǐng)求的jqXHR對(duì)象

以上內(nèi)容的核心思想是維護(hù)一個(gè)隊(duì)列,發(fā)送請(qǐng)求時(shí),將請(qǐng)求加入隊(duì)列,請(qǐng)求響應(yīng)后,從隊(duì)列中清除,這就保證了在任一時(shí)刻只能有一個(gè)同樣的請(qǐng)求發(fā)送.

局限性:僅僅是前臺(tái)防止jquery的ajax請(qǐng)求。對(duì)于非jquery的ajax請(qǐng)求,不起作用。因?yàn)槭褂玫氖莏query的ajaxPreFilter函數(shù),僅僅對(duì)jquery的ajax請(qǐng)求有作用。

調(diào)用abort后jquery會(huì)執(zhí)行error的方法,拋出abort的異常信息。可以使用以下方式區(qū)分出該類型的異常。

var ajax = $.ajax({ 'error':function(jqXHR, textStatus, errorThrown){  if(errorThrown != 'abort'){   //ajax被調(diào)用abort后執(zhí)行的方法   alert('您的ajax方法被停止了');  } }})

三、Demo

按鈕每次點(diǎn)擊都會(huì)向后端發(fā)送請(qǐng)求,下面的demo實(shí)現(xiàn)了多次點(diǎn)擊按鈕之后,只保證最后一次點(diǎn)擊的請(qǐng)求能夠成功。

<button id="button1">button1</button><button id="button2">button2</button><button id="button3">button3</button>  <script>  var pendingRequests = {};  jQuery.ajaxPrefilter(function( options, originalOptions, jqXHR ) {   var key = options.url;   console.log(key);   if (!pendingRequests[key]) {    pendingRequests[key] = jqXHR;   }else{    //jqXHR.abort(); //放棄后觸發(fā)的提交    pendingRequests[key].abort(); // 放棄先觸發(fā)的提交   }   var complete = options.complete;   options.complete = function(jqXHR, textStatus) {    pendingRequests[key] = null;    if (jQuery.isFunction(complete)) {    complete.apply(this, arguments);    }   };  });  <!-- 異步加載應(yīng)用列表開始 -->  $("#button1").live("click", function() {    $.ajax('config/ajax/appinfoListFetcher.json', {    type:'POST',    data: {param1:value1,       param2:value2,      },    success: function(res){      //后端數(shù)據(jù)回寫到頁面中    },    error:function(jqXHR, textStatus, errorThrown){     if(errorThrown != 'abort'){      //ajax被調(diào)用abort后執(zhí)行的方法      alert('應(yīng)用加載失敗!');     }    }    });    <!-- 異步加載應(yīng)用列表結(jié)束 -->   });</script>

以上就是防止重復(fù)發(fā)送Ajax請(qǐng)求的方法,希望對(duì)大家的學(xué)習(xí)有所幫助,本文具有很好的參考價(jià)值,非常值得大家收藏!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 原阳县| 夹江县| 南平市| 尼勒克县| 上高县| 安阳县| 浮山县| 大兴区| 含山县| 鹤峰县| 轮台县| 阳原县| 龙江县| 南平市| 都安| 胶州市| 青州市| 博湖县| 新密市| 鄂托克前旗| 黑河市| 抚州市| 大渡口区| 江陵县| 建水县| 天津市| 文化| 和田市| 博客| 紫金县| 革吉县| 麟游县| 双鸭山市| 大姚县| 兰溪市| 阿合奇县| 卫辉市| 漳州市| 武冈市| 奉化市| 武冈市|