随着前端技术的不断发展,现在做的项目里很多页面里都会有大量的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. LeetCode——Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  2. 【Hibernate步步】--一对一映射双向关联具体解释(两)

    很抱歉.有两天没更新博客文章,不要写文章一天真的感觉很是空的啊.制定一个写作习惯,想改也改不掉啊.说点题外话,前两天我收到一封私人信件给朋友,我写邀请函的文章OWS文章.一种技术用于研究图标工具,这位 ...

  3. 左右c++与java中国的垃圾问题的分析与解决

    左右c++与java中国的垃圾问题的分析与解决 DionysosLai(906391500@qq.com)  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码 ...

  4. Git 命令速查表

    Git 命令速查表 1.常用的Git命令 命令 简要说明 git add 添加至暂存区 git add-interactive 交互式添加 git apply 应用补丁 git am 应用邮件格式补丁 ...

  5. Poj 3517 And Then There Was One Joseph核心问题

    基本上纯Joseph核心问题,只是第一步多一件.m. 然后你就可以用获得的递推公式: Win(n) 代表n当个人的中奖号码, 然后,Win(n)必须相等Win(n-1).当一个人将在下一次删除队列. ...

  6. sscanf()函数的用法

    来自:http://blog.csdn.net/tigerjibo/article/details/6442151 sscanf 名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. ...

  7. 基于Jquery的多彩二维码的生成

    Demo效果图: 源代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name=&quo ...

  8. 【转】UiAutomator简要介绍

    原文地址:http://blog.csdn.net/g19920917/article/details/16131565 3.1.必备条件: 1.JDK    2.SDK(API高于15)    3. ...

  9. Group and sum array of hashes by date

    I have an array of hashes like this: [{:created=>Fri, 22 Jan 2014 13:02:13 UTC +00:00, :amount=&g ...

  10. MAC 配置--Tomcat服务器

    1. 下载tomcat版本(tar.gz) 到 apache官方主页 下载 Mac 版本的完整 tar.gz文件包.(问公司后台,是Tomcat 6.0/7.0/8.0版本?) 解压拷贝到 /Libr ...