随着前端技术的不断发展,现在做的项目里很多页面里都会有大量的ajax请求,随之而来就有了一些问题:

    1.没必要的ajax请求怎么处理?

    2.ajax链式调用怎么维护?

  ajax链式调用最原始的写法:

$.ajax({
...,
success:function(data){
$.ajax(...);
}
})

这里ajax链式调用我们当然可以使用Jquery的Queue或者When...Then(Done)实现,但是大量的ajax链式调用,这样写也会导致代码过于复杂。

Jquery里用Queue实现的ajax链式调用:

  

$.queue("myAjaxQueue",[
function(){
$.ajax({
...,
success:function(data){
//do something
$.dequeue("myAjaxQueue");
}
})
},
function(){
$.ajax({
...,
success:function(data){
//do something
$.dequeue("myAjaxQueue");
}
})
}
]);
$.dequeue("myAjaxQueue")

When...Then(Done)实现的链式调用:

$.when($.ajax({
...
}), $.ajax({
...
})).done(function (xhr1, xhr2) {
//do something
});

为了解放自己的双手,少写几行代码,于是决定自己写一个Ajax队列管理器,这里第一个遇到的问题是,怎么让后面的ajax请求知道什么时候轮到他们执行,显然我必须在ajax回调里发出通知,这里我用了函数劫持来动态添加发出通知的代码:首先定义一个函数劫持的封装函数:

/// <summary>通用的函数劫持定义</summary>
/// <param name="obj" type="Object">被劫持的对象</param>
/// <param name="method" type="String">被劫持的方法名</param>
/// <param name="hookLogic" type="Function">劫持逻辑</param>
/// <param name="beforeMethod" type="Boolean">是否在原函数逻辑执行之前执行</param>
hookMethod = function (obj, method, hookLogic, beforeMethod) {
var _method = obj[method];
if (!!_method) {
obj[method] = function () {
if (beforeMethod) {
hookLogic.apply(this, arguments);
_method.apply(this, arguments);
} else {
_method.apply(this, arguments);
hookLogic.apply(this, arguments);
}
}
}
};

然后Ajax队列管理器算是有着落了:

    AjaxQueue = function (name) {
/// <summary>Ajax队列管理器</summary>
/// <param name="name" type="String">队列名称</param>
this._name = name;
this._requests = [{}];
$(document).queue(this._name, []);
} AjaxQueue.prototype = {
Request: function (key, xhrOption) {
/// <summary>将Ajax请求放入队列</summary>
/// <param name="key" type="String">Ajax请求标示,用于管理Ajax状态</param>
/// <param name="xhrOption" type="Object Literal">JQuery Ajax对象参数选项</param>
var self = this;
if (!!xhrOption.complete) {
utils.hookMethod(xhrOption, "complete", ajaxHook, false);
} else {
utils.hookMethod(xhrOption, "success", ajaxHook, false);
utils.hookMethod(xhrOption, "error", ajaxHook, false);
}; function ajaxHook() {
$(document).dequeue(self._name); } $(document).queue(self._name, function () {
self.Abort(key);//取消未完成的相同请求
xhr = $.ajax(xhrOption);
self._requests.push({
key: key,
xhr: xhr
});
}); return self;
},
Abort: function (key) {
var self = this;
$.each(self._requests || [], function (i, req) {
if (req.key === key) {
try {
req.xhr.abort();
}
catch (err) { }
}
});
},
Run: function () {
$(document).dequeue(this._name);
return this;
}
};

里面集成了ajax链式调用、取消多余Ajax请求之功能,本文有任何不足之处,还望各位大虾指教。

最新文章

  1. SWF READER 破解日志。
  2. Android使用SAX解析XML(2)
  3. BZOJ2448 : 挖油
  4. 从Mono 4.0观C# 6.0部分新特性
  5. java 异常处理 Throwable Error 和Exception
  6. js 打开PDF
  7. C++ Socket TCP &quot;Hello World!&quot;
  8. JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
  9. 《神秘的程序员们》漫画26~28:《万年坑系列》 I、II、III(转)
  10. MVVM命令绑定原理
  11. springBoot系列教程02:mongodb的集成及使用
  12. 数学之美?编程之美?数学 + 编程= unbelievable 美!
  13. CMS收集器和G1收集器优缺点
  14. jenkins持续集成:jenkins+SVN
  15. centos通过Supervisor配置.net core守护进程
  16. node 文件操作
  17. 索引视图DEMO1
  18. C++中的 CONST 含义(从#define 到 CONST 的转变)
  19. 【转载】Activiti delete process definition by key
  20. shell-005:备份。

热门文章

  1. 错误&nbsp;4&nbsp;自定义工具错误:&nbsp;无法生成服务引用“DepartMentService”的代码。请检查其他错
  2. JNLP(Java Web Start )(转)
  3. SQL2000 MD5加密
  4. 数组排序、递归——(Java学习笔记二)
  5. gets、scanf和getchar之间的区别
  6. Android两个注意事项.深入了解Intent和IntentFilter(两)
  7. 由于问题引起信号ORA-27154无法启动数据库
  8. krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)
  9. Linux基础正则表达式:grep,sed
  10. POJ 3176-Cow Bowling(DP||记忆化搜索)