随着前端技术的不断发展,现在做的项目里很多页面里都会有大量的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请求之功能,本文有任何不足之处,还望各位大虾指教。

捣鼓一个Ajax请求管理器的更多相关文章

  1. 如何取消一个 Ajax 请求

    如何取消一个 Ajax 请求 jQuery XMLHttpRequest.abort() https://stackoverflow.com/questions/446594/abort-ajax-r ...

  2. $.ajax 请求 拦截器 重定向 无效 解决办法

    在ajax 异步请求下 拦截器过滤器中使用 重定向 页面响应无效 我这里用的是springboot框架,用拦截器实现 对请求的拦截 ,session超时直接跳转到login.html页面. 后台代码: ...

  3. 七、创建UcRESTTemplate请求管理器

    一.创建UcRESTTemplate管理器封装 import com.alibaba.fastjson.JSON; import org.apache.http.client.config.Reque ...

  4. php-fpm一个PHPFastCGI进程管理器

    PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个PHPFastCGI管理器,对于PHP 5.3.3之前的php来说,是一个补丁包 [1]  ,旨在将Fa ...

  5. 实现的一个ajax请求组件 有加载效果

    var zhanglei_Ajax = function(url,data,fn){ var str = '<div class="mask" style="pos ...

  6. 一个ajax请求,接收json数据

    <a id="inviterDel" onclick="delInviter(${item.inviterAddId})">删除</a> ...

  7. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...

  8. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求   Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java ...

  9. Struts2 在登录拦截器中对ajax请求的处理

    前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...

随机推荐

  1. JSP简单的练习-使用JDOM阅读xml文件

    <%@ page contentType="text/html; charset=gb2312" language="java" %> <%@ ...

  2. Developer Tool - 1. Text Tool and GNU/Linux Tool

    Below two links list famous tool about text processing and provide a good category. And it will give ...

  3. mariadb 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    [root@localhost /]# systemctl stop mariadb.service[root@localhost /]# mysqld_safe --user=mysql --ski ...

  4. C++ Primer 学习笔记_29_STL实践与分析(3) --操作步骤集装箱(下一个)

    STL实践与分析 --顺序容器的操作(下) 六.訪问元素 假设容器非空,那么容器类型的front和back成员将返回容器的第一个和最后一个元素的引用. [与begin和end的对照:] 1)begin ...

  5. [Network]Introduction and Basic concepts

    [该系列是检讨计算机网络知识.因为现在你想申请出国.因此,在写这篇博客系列的大多数英语.虽然英语,但大多数就是我自己的感受和理解,供大家学习和讨论起来] 1 Network Edge The devi ...

  6. java Json字符串转List<Map>类型

    //相关包 import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonPa ...

  7. linux_常用压缩,解压缩命令

    01-.tar格式解包:[*******]$ tar xvf FileName.tar打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩! ...

  8. 【百度地图API】手机浏览器抓包工具及其使用方法

    原文:[百度地图API]手机浏览器抓包工具及其使用方法 摘要:为了测试地图API在手机浏览器上的性能,需要给手机浏览器设置代理.通过代理,我们可以在PC上获取到抓包数据.进而对性能做进一步分析. -- ...

  9. CentOS-6.5-x86_64 最小化安装,已安装包的总数,这些包?

    一.我们怎么知道有多少的包被安装? [root@localhost ~]# rpm -qa | wc -l 217 二.怎样得知安装了那些软件包? [root@localhost ~]# rpm -q ...

  10. 搜集朋友写的几篇Android Elf相关的文档

    对android elf的资料学习,多数是在看雪找的资料,另一部分朋友的研究,当然,给他们提议过整理成一系列文章,只是大家工作都太忙,也都没顾上,这里简单整理放上一些pdf的资料,有兴趣的朋友能够看看 ...