多ajax请求的各类解决方案(同步, 队列, cancel请求)

•多个ajax请求同时发送,相互无依赖。

•多个ajax请求相互依赖,必须有先后顺序。

•多个请求被同时发送,只需要最后一个请求。

第1种case

应用场景: 这个场景很多,一个页面打开是多个区域同时请求后台得到各自的数据,没依赖,没顺序。

处理方案: 直接用jquery的ajax函数。这个用的非常多,这里从略,可看后面的代码中例子。

第2种case

应用场景: 多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果。例如: 用户登录后我们发送一次请求得到用户的应用ID,然后利用应用ID发送一次请求得到具体的应用内容(例子虽然不是太恰当,但基本就是这个意思了)。

处理方法:

1. 利用ajax参数async设置为false,进行同步操作。(这个方法只适合同域操作,跨域需使用下面两种方法)

2. 利用ajax嵌套(这个同第1种情况)

3. 利用队列进行操作

jquery ajax队列操作核心代码:

复制代码 代码如下:

(function ($) {

var ajaxRequest = {};

$.ajaxQueue = function (settings) {

var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);

var _complete = options.complete;

$.extend(options, {

complete: function () {

if (_complete)

_complete.apply(this, arguments);

if ($(document).queue(options.className).length > 0) {

$(document).dequeue(options.className);

} else {

ajaxRequest[options.className] = false;

}

}

});

$(document).queue(options.className, function () {

$.ajax(options);

});

if ($(document).queue(options.className).length == 1 && !ajaxRequest[options.className]) {

ajaxRequest[options.className] = true;

$(document).dequeue(options.className);

}

};

})(jQuery);

第3中case

应用场景: 比较典型的是autocomplete控件的操作,这个我们可以使用第2种情况的处理方法,但我们可能只需要最后次按键后返回的结果,这样利用第2种处理方法未免有些浪费。

处理方法: 保留最后一次请求,cancel之前的请求。

复制代码 代码如下:

(function ($) {

var jqXhr = {};

$.ajaxSingle = function (settings) {

var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);

if (jqXhr[options.className]) {

jqXhr[options.className].abort();

}

jqXhr[options.className] = $.ajax(options);

};

})(jQuery);

对于这些case都是在多个ajax请求,响应时间不能控制的情况。下面是完整Demo代码。

复制代码 代码如下:

(function ($) {

var jqXhr = {},

ajaxRequest = {};

$.ajaxQueue = function (settings) {

var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);

var _complete = options.complete;

$.extend(options, {

complete: function () {

if (_complete)

_complete.apply(this, arguments);

if ($(document).queue(options.className).length > 0) {

$(document).dequeue(options.className);

} else {

ajaxRequest[options.className] = false;

}

}

});

$(document).queue(options.className, function () {

$.ajax(options);

});

if ($(document).queue(options.className).length == 1 && !ajaxRequest[options.className]) {

ajaxRequest[options.className] = true;

$(document).dequeue(options.className);

}

};

$.ajaxSingle = function (settings) {

var options = $.extend({ className: 'DEFEARTNAME' }, $.ajaxSettings, settings);

if (jqXhr[options.className]) {

jqXhr[options.className].abort();

}

jqXhr[options.className] = $.ajax(options);

};

})(jQuery);

var ajaxSleep = (function () {

var _settings = {

type: 'GET',

cache: false,

success: function (msg) {

var thtml = $('#txtContainer').html();

$('#txtContainer').html(thtml + "<br />" + msg);

}

};

return {

get: function (seconds, mode, isAsync) {

var mode = mode || 'ajax',

isAsync = isAsync || false;

$[mode]($.extend(_settings, {

url: "ResponsePage.aspx?second=" + seconds,

async: isAsync,

className: 'GET'

}));

},

post: function (seconds, mode, isAsync) {

var mode = mode || 'ajax',

isAsync = isAsync || false;

$[mode]($.extend(_settings, {

type: 'POST',

url: "PostPage.aspx",

data: { second: seconds },

async: isAsync,

className: 'POST'

}));

}

};

} ());

var launch = function (settings) {

$('#txtContainer').html('');

var mode = settings.mode,

isAsync = settings.isAsync;

ajaxSleep.get(12, mode, isAsync);

ajaxSleep.get(10, mode, isAsync);

ajaxSleep.get(8, mode, isAsync);

ajaxSleep.post(6, mode, isAsync);

ajaxSleep.post(4, mode, isAsync);

ajaxSleep.post(2, mode, isAsync);

}

$(document).ready(function () {

//第1种case

$('#btnLaunchAsync').click(function () {

launch({ isAsync: true });

});

//第2种case

$('#btnLaunchSync').click(function () {

launch({});

});

//第2种case

$('#btnLaunchQueue').click(function () {

launch({ mode: 'ajaxQueue', isAsync: true });

});

//第3种case

$('#btnLaunchSingle').click(function () {

launch({ mode: 'ajaxSingle', isAsync: true });

});

});

default.html

复制代码 代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

<title></title>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>

<script type="text/javascript" src="js/default.js"></script>

</head>

<body>

<form id="form1" runat="server">

<input type="button" id="btnLaunchAsync" value="Launch Asynchronous Request" />

<input type="button" id="btnLaunchSync" value="Launch Synchronous Request" />

<input type="button" id="btnLaunchQueue" value="Launch Requested Queue" />

<input type="button" id="btnLaunchSingle" value="Launch Single Request" />

<div id="txtContainer"></div>

</form>

</body>

</html>

PostPage.aspx & ResponsePage.aspx

复制代码 代码如下:

//ResponsePage.aspx

protected void Page_Load(object sender, EventArgs e)

{

int seconds = int.Parse(Request.QueryString["second"]);

Thread.Sleep(seconds*1000);

Response.Write("GET: selpt for "+ seconds.ToString() +" sec(s)");

}

//PostPage.aspx

protected void Page_Load(object sender, EventArgs e)

{

int seconds = int.Parse(Request.Form["second"]);

Thread.Sleep(seconds * 1000);

Response.Write("POST: selpt for " + seconds.ToString() + " sec(s)");

}

后注: 个人能力有限,如有错误敬请指点。这些只是些根据一些特定情况下的处理,如果一个ajax请求能解决的问题切勿利用两个请求来处理,毕竟需要占用资源。我还是相信没有最好的方案,只有最适合的方案。

时间: 2024-09-28 04:11:13

多ajax请求的各类解决方案(同步, 队列, cancel请求)的相关文章

多ajax请求的各类解决方案(同步, 队列, cancel请求)_AJAX相关

•多个ajax请求同时发送,相互无依赖. •多个ajax请求相互依赖,必须有先后顺序. •多个请求被同时发送,只需要最后一个请求. 第1种case 应用场景: 这个场景很多,一个页面打开是多个区域同时请求后台得到各自的数据,没依赖,没顺序. 处理方案: 直接用jquery的ajax函数.这个用的非常多,这里从略,可看后面的代码中例子. 第2种case 应用场景: 多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果.例如: 用户登录后我们发送一次请求得到用户的应用I

iOS中使用NSURLConnection处理HTTP同步与异步请求_IOS

一.引言 在iOS7后,NSURLSession基本代替了NSURLConnection进行网络开发,在iOS9后,NSURLConnection相关方法被完全的弃用,iOS系统有向下兼容的特性,尽管NSURLConnection已经被弃用,但在开发中,其方法依然可以被使用,并且如果需要兼容到很低版本的iOS系统,有时就必须使用NSURLConnection类了. 二.使用NSURLConnection进行同步请求 对于网络请求分为同步和异步两种,同步是指在请求结果返回之前,程序代码会卡在请求处

.net 开发的网页,使用ajax.dll 来做ajax,在微信浏览器里不响应请求啊

问题描述 .net 开发的网页,使用ajax.dll 来做ajax,在微信浏览器里不响应请求啊 .net 开发的网页,们使用ajax.dll 来做ajax,在其他浏览器都好用只是在微信浏览器里不响应请求啊,是微信浏览器不支持ajax,还是ajax.dll不行,或者有什么方法可以替代呢? 解决方案 .net2003 使用 Ajax.dll 小结.net2003中ajax.dll用法 解决方案二: http://ask.csdn.net/questions/186667

Java并发包中的同步队列SynchronousQueue实现原理

作者:一粟 介绍 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take,反过来也一样. 不像ArrayBlockingQueue或LinkedListBlockingQueue,SynchronousQueue内部并没有数据缓存空间,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试着取走的时候才可能存在,不取走而只想偷窥一下是不行的,当然遍历这个队列的操

iOS开发那些事-iOS网络编程同步GET方法请求编程

iOS SDK为HTTP请求提供了同步和异步请求两种不同的API,而且可以使用GET或POST等请求方法.我们先了解其中最为简单的同步GET方法请求. 为了学习这些API的使用MyNotes"备忘录"应用实例,数据来源于服务器端,而不是本地的Notes.xml(或Notes.json)文件. 首先实现查询业务,查询业务请求可以在主视图控制器MasterViewController类中实现,其中MasterViewController.h代码如下: #import <UIKit/U

XMLHttpRequest的同步和异步请求

客户端利用XMLHTTP发送请求得到服务端应答数据,并用Javascript操作DOM最终更新页面- 又称无刷新更新页面,有代替传统web开发中采用form(表单)递交方式更新web页面的趋势.XMLHTTP依赖于XMLHttpRequest完成从客户端的请求到服务端的应答.XMLHttpRequest提供了两个方法open和send.open方法用于初始化XMLHttpRequest对象.指示请求的方式(get.post等).安全性连接等,在调用open方法后必须调用send方法发送Http

使用jsonp完成跨域请求,但是请求的链接是js文件,请求总是那个js报错,怎莫办?

问题描述 使用jsonp完成跨域请求,但是请求的链接是js文件,请求总是那个js报错,怎莫办? 把链接换成php就没问题. $.ajax({ type:'GET', async:false, url:"http://app.veishu.com/jsonp/categories/all.js", dataType:"jsonp", success:function(data){ alert("success"); // alert(data[0]

Android Http请求框架二:xUtils 框架网络请求

一:对Http不了解的请看 Android Http请求框架一:Get 和 Post 请求   二.正文 1.xUtils 下载地址     github 下载地址  : https://github.com/wyouflf/xUtils   2.关于网络请求的方法 package com.jike.shanglv.NetAndJson; import java.io.File; import com.lidroid.xutils.HttpUtils; import com.lidroid.xu

jquery ajax加载提示信息与同步加载详解

个周末我一直郁闷:为什么光棍节这么值得大家庆祝.从线上到线下,从城市到农村,从高校学生到普通上班族,整个世界彻底疯狂了.如果时机来了,我想,我还是希望脱光光.滚球光棍节! 这个星期的任务主要就是一个年底活动专题的设计.主要涉及的技术还是前端ajax+jquery的使用.我一直觉得前端比后端难写.呵呵,在小流量的情况下,后端一般都不会出现什么问题,但是前端一有错误马上就可以看出来....通过这个专题页面自己对ajax的认识要提升了一点: 1.ajax的同步和异步加载.    因为ajax默认是异步