随着前端技术的不断发展,现在做的项目里很多页面里都会有大量的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. Json.NET提供依赖注

    Json.NET提供依赖注 [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection) 前言 在一些小型项目的开发情景里,系统不需要大型DI Framework所提 ...

  2. UVa 11790 - Murcia&#39;s Skyline

    称号:给你一个行长度的建设和高度,我们祈求最长的和下降的高度. 分析:dp,最大上升子. 说明:具有长度,不能直接优化队列单调. #include <iostream> #include ...

  3. nginx做反向负载均衡,后端服务器获取真实客户端ip(转)

    首先,在前端nginx上需要做如下配置: location / proxy_set_hearder host                $host; proxy_set_header X-forw ...

  4. 第12章 代理模式(Proxy Pattern)

    原文   第12章 代理模式(Proxy Pattern) 代理模式 概述: 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要 ...

  5. OOP 创建对象的7种方式

    JavaScript OOP 创建对象的7种方式   我写JS代码,可以说一直都是面向过程的写法,除了一些用来封装数据的对象或者jQuery插件,可以说对原生对象了解的是少之又少.所以我拿着<J ...

  6. Controller与Action

    Controller与Action 我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本 ...

  7. MVC4 + EF为Model添加单独的验证属性

    可使用以下方式给Model加上相关的meta验证属性,这样实体的验证属性就不会被例如EF或其他工具自动生成的Model所替换了. using System.ComponentModel.DataAnn ...

  8. crawler_工具类_RegexUtils_正则帮助类

    package com.cph.crawler.core.utils; import java.util.ArrayList; import java.util.List; import java.u ...

  9. UML之轻松入门(2)-掌握Junit,让我们的开发更高效

         使用UML不仅能够形象化的表达我们的程序思想,并且能够帮助我们提高程序的质量.一个杂乱无章的程序让维护者望而生畏,其成本也可想而知.在面向程序设计(OOD)中有5条原则是帮助我们设计一个高效 ...

  10. [MySQL]--&gt;查询5天之内过生日的同事中的闰年2月29日问题的解决过程

    前言: 上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,当中漏了一个闰年2月 ...