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

首頁 > 編程 > JavaScript > 正文

jQuery AjaxQueue改進步驟

2019-11-20 23:38:48
字體:
供稿:網(wǎng)友
假期里沒事就想著改進下,改得地方不多,主要有以下三點:
complete回調(diào)在jquery1.5以后可以是一個函數(shù)數(shù)組,按數(shù)組順序調(diào)用。
如果前一個請求未返回,新的請求發(fā)出,那么撤銷前一個請求,也就是新的請求“覆蓋”原請求。
寫成面向?qū)ο蟮男问剑儆靡粋€AjaxManage進行簡單的管理。
代碼如下,詳細可看注釋:
復制代碼 代碼如下:

;(function($) {
// override:新的請求是否要覆蓋之前的請求
function AjaxQueue(override) {
this.override = !!override;
};
AjaxQueue.prototype = {
requests: new Array(),
offer: function(options) {
var _self = this;
var xhrOptions = $.extend({}, options, {
complete: function(jqXHR, textStatus) {
// 支持complete是函數(shù)數(shù)組的情況
if($.isArray(options.complete)) {
var funcs = options.complete;
for(var i = 0, len = funcs.length; i < len; i++)
funcs[i].call(this, jqXHR, textStatus);
} else {
if(options.complete)
options.complete.call(this, jqXHR, textStatus);
}
// 處理結(jié)束,從隊列中發(fā)出下一個ajax請求
_self.poll();
},
beforeSend: function(jqXHR, settings) {
if(options.beforeSend)
var ret = options.beforeSend.call(this, jqXHR, settings);
// 如果當前ajax請求因為某些原因被撤銷了,那么去發(fā)下一個ajax請求
if(ret === false) {
_self.poll();
return ret;
}
}
});
// 如果支持覆蓋,那么調(diào)用replace
if(this.override) {
// console.log('go override');
this.replace(xhrOptions);
// 反之放入隊列
} else {
// console.log('go queue');
this.requests.push(xhrOptions);
if(this.requests.length == 1) {
$.ajax(xhrOptions);
}
}
},
// 撤銷前一個請求,發(fā)送新的請求
replace: function(xhrOptions) {
var prevRet = this.peek();
if(prevRet != null) {
// jquery源碼中可以看到此方法
prevRet.abort();
}
this.requests.shift();
this.requests.push($.ajax(xhrOptions));
},
// 輪詢隊列 發(fā)送下一個請求
poll: function() {
if(this.isEmpty()) {
return null;
}
var processedRequest = this.requests.shift();
var nextRequest = this.peek();
if(nextRequest != null) {
$.ajax(nextRequest);
}
return processedRequest;
},
// 返回隊列頭部的請求
peek: function() {
if(this.isEmpty()) {
return null;
}
var nextRequest = this.requests[0];
return nextRequest;
},
// 判斷隊列是否為空
isEmpty: function() {
return this.requests.length == 0;
}
};
var queue = {};
// 管理AjaxQueue的簡單對象
var AjaxManager = {
// 創(chuàng)建新的ajaxQueue
createQueue: function(name, override) {
return queue[name] = new AjaxQueue(override);
},
// 清除對應name的ajaxQueue
destroyQueue: function(name) {
if(queue[name]) {
queue[name] = null;
delete queue[name];
}
},
// 根據(jù)name得到對應的ajaxQueue
getQueue: function(name) {
return ( queue[name] ? queue[name] : null);
}
};
// 跟jQuery關聯(lián)起來,給個簡稱,方便調(diào)用
$.AM = AjaxManager;
})(jQuery);

其實也想再加上done,fail,always等配置,但或許會變得有點復雜,就先保持簡單
這里有兩個我的jsfiddle頁面,一個是覆蓋效果的,一個是隊列效果的,可以直接測試運行。
就到這里,如有問題,歡迎指出,thanks。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 江阴市| 赤壁市| 吉木乃县| 德兴市| 翁牛特旗| 邓州市| 石城县| 仁布县| 宿迁市| 仁怀市| 通道| 海口市| 昂仁县| 泸州市| 安西县| 三原县| 东兴市| 金坛市| 仁布县| 林西县| 白银市| 万宁市| 外汇| 榆中县| 和龙市| 旬邑县| 镇沅| 绥棱县| 莆田市| 黎川县| 洞口县| 金川县| 铜梁县| 年辖:市辖区| 厦门市| 晋中市| 梧州市| 梧州市| 凌云县| 龙海市| 来安县|