jquery Ajax Queue 队列实现

有时候我们需要按顺序调用一组ajax,这些ajax需要有先后顺序,类似于同步的ajax,那么我们可以通过以下的方式来实现:

(这个Ajax用到jQuery.post) 

//定义一个AJAX队列
$.newAjaxQueue = function() {
	var queue = [], posting = false, fn = function() {
		if (queue.length) {
			posting = true;
			var request = queue.shift();
			var url = request.url;
			var params = request.params;
			var callback = request.callback;
			if (typeof (params) === 'function') {
				callback = params;
				params = {};
			}
			$.post(url, params, function(response, status, xhr) {
				try {
					if (typeof (callback) === 'function') {
						callback(response);
					}
				} finally {
					fn();
					posting = false;
				}
			}, 'text');
		}
	}, instance = ({
		post : function(url, params, callback) {
			queue.push({
				url : url,
				params : params,
				callback : callback
			});
			if (posting === false) {
				fn();
			}
			return instance;
		}
	});
	return instance;
};

 

使用方法:

首先创建一个Ajax队列,然后为这个Ajax队列,添加需要执行的ajax操作(post操作),这些Ajax会按顺序执行,一个执行完毕之后(获得返回值),再继续执行下一个。

$.newAjaxQueue().post( [URL] , [参数] ,[回调函数] ).post( [URL] , [参数] ,[回调函数] ).post( [URL] , [参数] ,[回调函数] );

这个实现没有考虑到超时等情况,如果需要可以自己添加。

 演示例子:

<html>
<body>
	<script type="text/javascript">
		//这个地方应该引用jQuery,此处只是个测试的例子,提供一个$.post方法。 
		var $ = {
			post : function(url, params, callback) {
				setTimeout(function() {
					callback('{}' + url);
				}, (Math.random() * 1000) >> 0);
			}
		}
		//打印输出的测试方法 
		var log = function(info) {
			var div = document.createElement('div');
			div.innerHTML = info;
			document.body.appendChild(div);
		}
		//定义一个AJAX队列 
		$.newAjaxQueue = function() {
			var queue = [], posting = false, fn = function() {
				if (queue.length) {
					posting = true;
					var request = queue.shift();
					var url = request.url;
					var params = request.params;
					var callback = request.callback;
					if (typeof (params) === 'function') {
						callback = params;
						params = {};
					}
					$.post(url, params, function(response, status, xhr) {
						try {
							if (typeof (callback) === 'function') {
								callback(response);
							}
						} finally {
							fn();
							posting = false;
						}
					}, 'text');
				}
			}, instance = ({
				post : function(url, params, callback) {
					queue.push({
						url : url,
						params : params,
						callback : callback
					});
					if (posting === false) {
						fn();
					}
					return instance;
				}
			});
			return instance;
		};
		//测试队列的执行 
		$.newAjaxQueue().post('url1', {
			a : 1
		}, function(response) {
			log('test:1');
		}).post('url2', {
			a : 1
		}, function(response) {
			log('test:2');
		}).post('url3', {
			a : 1
		}, function(response) {
			log('test:3');
		}).post('url4', {
			a : 1
		}, function(response) {
			log('test:4');
		}).post('url5', {
			a : 1
		}, function() {
			log('test:5');
		});
	</script>
</body>
</html>

 

转载于:https://my.oschina.net/u/913265/blog/892876

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值