最近遇到,如果用戶頻繁點(diǎn)擊ajax請(qǐng)求,有兩個(gè)問(wèn)題:
1,如果連續(xù)點(diǎn)擊了5個(gè)ajax請(qǐng)求,前4個(gè)其實(shí)是無(wú)效的,趁早結(jié)束節(jié)省資源。
2,更嚴(yán)重的問(wèn)題是:最后一個(gè)發(fā)送的請(qǐng)求,響應(yīng)未必是最后一個(gè),有可能造成混亂。還需要一個(gè)隊(duì)列來(lái)維護(hù)發(fā)送的請(qǐng)求和響應(yīng)。
我其實(shí)已經(jīng)設(shè)計(jì)好了該隊(duì)列的實(shí)現(xiàn)方式,后來(lái)發(fā)現(xiàn)jQuery直接通過(guò)abort方法,這樣就不需要那么復(fù)雜的實(shí)現(xiàn)了,畢竟還有其他事情等著完成。
用jquery發(fā)送ajax請(qǐng)求的確是太方便了,$.get、$.post、$.ajax等等,但我們有時(shí)候需要中途中止ajax請(qǐng)求。
舉個(gè)例子,用comet做聊天時(shí),發(fā)送一個(gè)請(qǐng)求后,服務(wù)端通常過(guò)幾十秒后才會(huì)刷新鏈接、返回?cái)?shù)據(jù)。假設(shè)服務(wù)端是30秒刷新一次鏈接,如果我們?cè)?0秒時(shí)想要停止這個(gè)ajax請(qǐng)求,怎么辦呢?
先上代碼,后面再解釋
var ajaxGet = $.get(“comet_server.php”,{id:1},function(data){….//一些操作});ajaxGet.abort();上面這段代碼其于兩個(gè)知識(shí)點(diǎn):
1. $.get返回的數(shù)據(jù)類型是XMLHttpRequest,請(qǐng)參考手冊(cè)。($.post、$.ajax、$.getJSON、$.getScript也同樣)
2. XMLHttpRequest對(duì)象有abort()方法
注意:abort()后,ajax請(qǐng)求立即停止,但還是會(huì)執(zhí)行后面的function()。如果想避免執(zhí)行其中的操作,可以在function()開始位置加判斷
var ajaxGet = $.get(“comet_server.php”,{id:1},function(data){if(data.length == 0) return true;….//一些操作});ajaxGet.abort();終止ajax請(qǐng)求:
var request = $.get(“ajax.aspx”,{id:1},function(data){ //do something});//終止請(qǐng)求動(dòng)作.request.abort();防止重復(fù)請(qǐng)求:
var request;if(request != null) request.abort();request = $.get(“ajax.aspx”,{id:1},function(){ //do something});ajax & setTimeout實(shí)現(xiàn) secondTry 在等待一秒之后將firstTry的ajax終止:var firstTry = $.ajax( //do something );var secondTry = setTimeout(function(){alert(‘ok');firstTry.abort()},1000);新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注