一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

多ajax請求的各類解決方案(同步, 隊(duì)列, cancel請求)

 WindySky 2018-03-09

ajax帶來很好的用戶體驗(yàn),于是一個(gè)稍微注重web系統(tǒng)使用ajax基本成為必然。當(dāng)傳統(tǒng)功能型web項(xiàng)目向用戶體驗(yàn)型項(xiàng)目轉(zhuǎn)變時(shí),層出不窮的需求就來了。正如本篇所介紹的就是一個(gè)多個(gè)AJAX請求的情況下,如何利用jquery來處理幾種case


  1. 多個(gè)ajax請求同時(shí)發(fā)送,相互無依賴。
  2. 多個(gè)ajax請求相互依賴,必須有先后順序。
  3. 多個(gè)請求被同時(shí)發(fā)送,只需要最后一個(gè)請求。

第1種case

應(yīng)用場景: 這個(gè)場景很多,一個(gè)頁面打開是多個(gè)區(qū)域同時(shí)請求后臺(tái)得到各自的數(shù)據(jù),沒依賴,沒順序。
處理方案: 直接用jquery的ajax函數(shù)。這個(gè)用的非常多,這里從略,可看后面的代碼中例子。

第2種case

應(yīng)用場景: 多個(gè)ajax請求,需要順序執(zhí)行,后一個(gè)ajax請求的執(zhí)行參數(shù)是前一個(gè)ajax的結(jié)果。例如: 用戶登錄后我們發(fā)送一次請求得到用戶的應(yīng)用ID,然后利用應(yīng)用ID發(fā)送一次請求得到具體的應(yīng)用內(nèi)容(例子雖然不是太恰當(dāng),但基本就是這個(gè)意思了)。
處理方法:
1. 利用ajax參數(shù)async設(shè)置為false,進(jìn)行同步操作。(這個(gè)方法只適合同域操作,跨域需使用下面兩種方法)
2. 利用ajax嵌套(這個(gè)同第1種情況)
3. 利用隊(duì)列進(jìn)行操作

jquery ajax隊(duì)列操作核心代碼:

(function ($) {
var ajaxRequest = {};
$.ajaxQueue = function (settings) {
var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);
var _complete = options.complete;
$.extend(options, {
complete: function () {
if (_complete)
_complete.apply(this, arguments);
if ($(document).queue(options.className).length > 0) {
$(document).dequeue(options.className);
} else {
ajaxRequest[options.className] = false;
}
}
});
$(document).queue(options.className, function () {
$.ajax(options);
});
if ($(document).queue(options.className).length == 1 && !ajaxRequest[options.className]) {
ajaxRequest[options.className] = true;
$(document).dequeue(options.className);
}
};
})(jQuery);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

第3中case

應(yīng)用場景: 比較典型的是autocomplete控件的操作,這個(gè)我們可以使用第2種情況的處理方法,但我們可能只需要最后次按鍵后返回的結(jié)果,這樣利用第2種處理方法未免有些浪費(fèi)。
處理方法: 保留最后一次請求,cancel之前的請求。

(function ($) {
var jqXhr = {};
$.ajaxSingle = function (settings) {
var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);
if (jqXhr[options.className]) {
jqXhr[options.className].abort();
}
jqXhr[options.className] = $.ajax(options);
};
})(jQuery); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

對于這些case都是在多個(gè)ajax請求,響應(yīng)時(shí)間不能控制的情況。下面是完整Demo代碼。

(function ($) {
var jqXhr = {},
ajaxRequest = {};
$.ajaxQueue = function (settings) {
var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);
var _complete = options.complete;
$.extend(options, {
complete: function () {
if (_complete)
_complete.apply(this, arguments);
if ($(document).queue(options.className).length > 0) {
$(document).dequeue(options.className);
} else {
ajaxRequest[options.className] = false;
}
}
});
$(document).queue(options.className, function () {
$.ajax(options);
});
if ($(document).queue(options.className).length == 1 && !ajaxRequest[options.className]) {
ajaxRequest[options.className] = true;
$(document).dequeue(options.className);
}
};
$.ajaxSingle = function (settings) {
var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);
if (jqXhr[options.className]) {
jqXhr[options.className].abort();
}
jqXhr[options.className] = $.ajax(options);
};
})(jQuery);
var ajaxSleep = (function () {
var _settings = {
type: 'GET',
cache: false,
success: function (msg) {
var thtml = $('#txtContainer').html();
$('#txtContainer').html(thtml + "<br />" + msg);
}
};
return {
get: function (seconds, mode, isAsync) {
var mode = mode || 'ajax',
isAsync = isAsync || false;
$[mode]($.extend(_settings, {
url: "ResponsePage.aspx?second=" + seconds,
async: isAsync,
className: 'GET'
}));
},
post: function (seconds, mode, isAsync) {
var mode = mode || 'ajax',
isAsync = isAsync || false;
$[mode]($.extend(_settings, {
type: 'POST',
url: "PostPage.aspx",
data: { second: seconds },
async: isAsync,
className: 'POST'
}));
}
};
} ());
var launch = function (settings) {
$('#txtContainer').html('');
var mode = settings.mode,
isAsync = settings.isAsync;
ajaxSleep.get(12, mode, isAsync);
ajaxSleep.get(10, mode, isAsync);
ajaxSleep.get(8, mode, isAsync);
ajaxSleep.post(6, mode, isAsync);
ajaxSleep.post(4, mode, isAsync);
ajaxSleep.post(2, mode, isAsync);
}
$(document).ready(function () {
//第1種case
$('#btnLaunchAsync').click(function () {
launch({ isAsync: true });
});
//第2種case
$('#btnLaunchSync').click(function () {
launch({});
});
//第2種case
$('#btnLaunchQueue').click(function () {
launch({ mode: 'ajaxQueue', isAsync: true });
});
//第3種case
$('#btnLaunchSingle').click(function () {
launch({ mode: 'ajaxSingle', isAsync: true });
});
}); 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

default.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www./TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www./1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script src="https://ajax./ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/default.js"></script>
</head>
<body>
<form id="form1" runat="server">
<input type="button" id="btnLaunchAsync" value="Launch Asynchronous Request" />
<input type="button" id="btnLaunchSync" value="Launch Synchronous Request" />
<input type="button" id="btnLaunchQueue" value="Launch Requested Queue" />
<input type="button" id="btnLaunchSingle" value="Launch Single Request" />
<div id="txtContainer"></div>
</form>
</body>
</html> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

PostPage.aspx & ResponsePage.aspx

//ResponsePage.aspx
protected void Page_Load(object sender, EventArgs e)
{
int seconds = int.Parse(Request.QueryString["second"]);
Thread.Sleep(seconds*1000);
Response.Write("GET: selpt for "+ seconds.ToString() +" sec(s)");
}
//PostPage.aspx
protected void Page_Load(object sender, EventArgs e)
{
int seconds = int.Parse(Request.Form["second"]);
Thread.Sleep(seconds * 1000);
Response.Write("POST: selpt for " + seconds.ToString() + " sec(s)");
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    亚洲中文字幕视频在线播放 | 国产丝袜美女诱惑一区二区| 欧美日韩三区在线观看| 热情的邻居在线中文字幕| 久久热在线免费视频精品| 日本av一区二区不卡| 日本一本不卡免费视频| 欧美日韩亚洲国产精品| 久久青青草原中文字幕| 亚洲中文在线男人的天堂| 好吊色免费在线观看视频| 人人爽夜夜爽夜夜爽精品视频| 欧美色婷婷综合狠狠爱| 在线观看国产成人av天堂野外| 亚洲国产黄色精品在线观看| 亚洲中文字幕视频一区二区| 国产精品一区日韩欧美| 国产内射一级一片内射高清视频| 伊人网免费在线观看高清版| 亚洲欧美日韩网友自拍| 日韩一区二区三区久久| 人人妻在人人看人人澡| 欧美六区视频在线观看| 精品人妻一区二区三区四区久久 | 久久热九九这里只有精品| 91亚洲国产成人久久精品麻豆| 亚洲精品中文字幕熟女| 日本人妻精品中文字幕不卡乱码| 国产精品推荐在线一区| 又大又长又粗又猛国产精品| 国产欧美另类激情久久久| 欧美国产极品一区二区| 亚洲国产精品久久综合网| 性感少妇无套内射在线视频| 亚洲精品一区二区三区日韩| 国产老熟女超碰一区二区三区| 亚洲一区二区三区国产| 成人精品一区二区三区综合| 亚洲精品国产美女久久久99| 国产成人精品一区二三区在线观看 | 国产精品久久三级精品|