有时候我们需要按顺序调用一组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>

最新文章

  1. $.data(data , &quot;&quot;)
  2. Hibernate + proxool 连接数超过最大允许连接数
  3. ms mpi error: unable to allocate launching block
  4. win7 设置自动关机
  5. SQL*Net message from client
  6. Ajax - 手册
  7. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
  8. python各种web框架对比
  9. Web用户登录---验证码的设计与实现
  10. .NET-记一次架构优化实战与方案-前端优化
  11. [转]CR, LF, CR/LF区别与关系
  12. windows安装anaconda 报错failed to create anacoda menu ?
  13. Appium入门(3)__ Appium Server安装
  14. svn的下载链接
  15. koa2怎么自定义一个中间件
  16. Strange Addition
  17. ABAP术语-V2 Module
  18. Jenkins在deploy maven artifact时报Peer not authenticated.
  19. jQuery.getJSON跨域访问的正确使用方式(史上最傻瓜式解释)
  20. Sql Server数据库对象访问权限控制

热门文章

  1. oracle 10g函数大全--字符型函数
  2. http://blog.csdn.net/a9529lty/article/details/6454145
  3. TreeView 类 事件
  4. vue - webpack.base.conf.js
  5. windows下检測软件的网络连接
  6. Java之内部类(1) - 为什么需要内部类
  7. Python 爬虫之 BeautifulSoup
  8. openssl 创建证书的总结和注意事项
  9. HDFS原理解析(整体架构,读写操作流程及源代码查看等)
  10. LNMP架构三