`

(转)实现Ajax请求队列按顺序执行

 
阅读更多
摘自http://www.ilovejs.net/archives/163
之前想做一个Web桌面的项目,考虑的必须得使用Ajax请求队列,使得Ajax的请求能按照队列按顺序执行,解决了Ajax异步传输覆盖的问题,也看了几个别人的代码,都整不太明白,所以自己干脆自己搞搞阵,自己实现,也得个安慰奖。我的实现方法很简单,通过递归调用函数,而无需使用定时器去检查Ajax请求是否已经执行完毕,具体的例子请看下面的代码:
Javascript:

onload = function(){
  document.getElementById("btn").onclick = function(){
    //添加请求队列
  addAjax({method: "GET",url: "test2.txt",callback: callback1});
  addAjax({method: "GET",url: "test.txt",callback: callback2});
  addAjax({method: "GET",url: "test2.txt",callback: callback3});
    //开始执行队列
    executeAjax();
  }
}
var callback1 = function(data, xhr){
  document.getElementById("div1").innerHTML = data;
}
var callback2 = function(data, xhr){
  document.getElementById("div2").innerHTML = data;
}
var callback3 = function(data, xhr){
  document.getElementById("div3").innerHTML = data;
}


HTML:

<div id="div1">getStyle test.</div>
<div id="div2">getStyle test.</div>
<div id="div3">getStyle test.</div>
<input type="button" value="Get data" id="btn" />


这三个请求会按顺序执行下来,请点击查看具体效果

下面展示我所实现这个请求队列的Javascript源码:

var ajaxes = []; //用于存储参数对象的队列
//用于声明XMLHttpRequest实例对象
var Xhr = function(){
  var xhr = false;
  try {
    xhr = new XMLHttpRequest();
  }
  catch (e) {
    try {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return xhr;
}
var xhr = new Xhr(); //获得XMLHttpRequest实例对象xhr
//executeAjax是主要的执行Ajax的函数
var executeAjax = function(){
  //如果队列为空,则退出执行
  if (!ajaxes.length)
  return;
  var options = ajaxes[0];
  if (xhr) {
    xhr.open(options.method, options.url, true);
    xhr.onreadystatechange = function(){
      if (xhr.readyState === 4 &amp;&amp; (xhr.status === 200 || xhr.status === 304)) {
        options.callback(xhr.responseText, xhr);
        //删除队列中的第一个请求
        ajaxes.shift();
        //如果队列中还有请求,就接着递归执行executeAjax函数,直到队列为空
        if (ajaxes.length > 0) {
          executeAjax();
        }
      }
    }
    if (xhr.method === "post") {
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    }
    xhr.send(options.data || null);
  }
}
//用于添加队列的函数
var addAjax = function(options){
  ajaxes.push(options);
}

上面写的或许有些人会认为封装性不好,污染全局变量,如果封装起来也是非常简单的,这只是本人实现了这个效果时候的草稿,放到具体的项目中当然会封装为类或者对象,方便调用,具体的封装后的代码就不提供了。

另外看上面大虾写的代码时也学习了另外一点

使用Ajax提交的参数多是些简单的字符串,可以直接使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null。
    例如 :
    var url = "login.jsp?user=XXX&pwd=XXX";
                 xmlHttpRequest.open("GET",url,true);
                 xmlHttpRequset.send(null);

       此外,也可以使用send方法传递参数。使用send方法传递参数使用的是POST方法,需要设定Content-Type头信息,模拟HTTP POST方法发送一个表单,这样服务器才会知道如何处理上传的内容。参数的提交格式和GET方法中url的写法一样。设置头信息前必须先调用open方法。
       例如:
     xmlHttpRequest.open("POST","login.jsp",true);
     xmlHttpRequest.setRequestHeder("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
     xmlHttpRequest.send("user="+username+"&pwd="+password);

需要注意的是根据提交方式的不同,两种提交方式分别调用后台的doGet方法和doPost方法。
下面有人的总结摘录下
引用

学习的过程中发现几点:

1 Url不能使用其它domain, 比如用了http://www.google.cn/xxx.html, 结果提示没有权限使用 XMLHttpRequest.open();
2 XMLHttpRequest.send() 必须带参, 如果没有可以使用 XMLHttpRequest.send(null);
3 XMLHttpRequest.open(method, url, flag) 如果flag==false, 则不回调 XMLHttpRequest.onreadystatechange;

分享到:
评论

相关推荐

    AJAX请求队列实现

    AJAX请求队列实现主要讲解了如何管理多个异步AJAX请求,确保它们能够按照一定的顺序执行,以防止请求因执行时机冲突而被取消或丢失。在Web应用中,用户可能会在短时间内发起多个请求,这些请求可能是异步的。如果不...

    解决Ajax 发送多个请求引发的并发问题

    这里提供一个使用jQuery的Ajax请求队列示例: ```javascript var requestQueue = []; function sendAjaxRequest(url, callback) { if (requestQueue.length === 0) { $.ajax({ url: url, success: function...

    ajaxQueue:ajax请求队列

    多个ajax请求相互依赖,必须有先后顺序。 多个请求被同时发送,只需要最后一个请求。 1.情况1-多个ajax请求同时发送,相互无依赖 ajaxQueue1文件夹 ajaxQueue-requireJS //为符合AMD规范的文件,可以直接作为...

    jQuery AJAX 扩展 ----自动放弃及 队列实现

    此外,`$.queue()`方法允许我们自定义队列,比如将多个Ajax请求按顺序执行: ```javascript var queue = $({}); queue.queue('ajax', [ function(next) { $.ajax('url1').done(next); }, function(next) { $....

    多个ajax同时进行

    2. **请求队列**:对于需要控制请求顺序或限制并发量的场景,可以使用请求队列。新的请求会被添加到队列尾部,只有当前正在执行的请求完成后,才会处理下一个请求。 3. **超时和重试机制**:为了处理可能的网络问题...

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

    在现代Web开发中,AJAX...同步请求适用于有依赖关系的场景,队列管理用于按顺序执行请求,而取消请求则在需要忽略之前请求结果时非常有用。掌握这些技巧,能够帮助开发者构建更高效、响应更快的Web应用程序。

    jquery的 ajax序列插件

    `gnarf-jquery-ajaxQueue`是一个专门为了解决这个问题而设计的jQuery插件,它允许开发者创建和管理一系列按顺序执行的Ajax请求。 **1. 插件介绍** `gnarf-jquery-ajaxQueue`的核心功能是创建一个Ajax请求的队列,...

    extjs对ajax的支持文档

    - Ext.Ajax也支持批量请求管理和队列控制,允许开发者组织和顺序执行多个Ajax请求。 8. **预处理和后处理**: - `beforeSend`: 在发送请求前执行的函数,可以取消请求。 - `loadFn`和`unloadFn`: 对于资源加载和...

    JQuery+ajax实现批量上传图片

    需要注意的是,由于图片文件较大,网络延迟可能会导致上传过程较长,因此需要适当处理请求队列,避免并发请求过多导致服务器压力过大。 3. **延时机制**:为了避免图片上传时因命名冲突导致的数据覆盖问题,可以...

    前端项目-jquery-ajaxQueue.zip

    而ajaxQueue则允许我们将Ajax请求放入队列中,按照预设的顺序依次执行,确保了数据处理的顺序性。这在处理依赖性较强的数据或者需要按序执行的异步操作时,显得尤为关键。 ajaxQueue的核心功能在于其队列管理机制。...

    基于spring 消息队列

    在这个基于Spring的消息队列系统中,前端Web应用通过并发发送Ajax请求来获取数据,后端Action将这些数据放入缓冲队列中,然后由单线程消费者来消费队列中的数据并进行持久化存储。下面我们将深入探讨这个系统的关键...

    详解JavaScript for循环中发送AJAX请求问题

    这导致了在for循环中发送多个AJAX请求时可能出现的问题:由于循环速度过快,请求可能在前一个请求完成之前就被发送,导致请求队列积压,甚至某些请求被浏览器取消。 针对这个问题,有两种主要的解决策略: 1. **...

    Ajax Design Patterns

    9. **异步队列**:为了防止多个Ajax请求同时执行导致服务器压力过大,可以使用异步队列来控制请求顺序。 10. **无刷新导航**:使用Ajax实现页面间导航,保持当前状态并避免页面跳转,提升浏览体验。 11. **历史...

    提高AJAX客户端响应速度

    6. **异步请求队列**:避免同时发起大量AJAX请求,可能导致服务器压力过大。可以使用队列管理请求,按顺序或优先级执行。 7. **预加载策略**:对于即将需要的数据,可以预先发起请求,减少延迟感。 8. **错误处理*...

    防止重复发送Ajax请求的解决方案

    这通常通过维护一个请求队列来实现。例如,可以使用jQuery的`ajaxPrefilter`函数来过滤并控制Ajax请求。 ```javascript var pendingRequests = {}; $.ajaxPrefilter(function(options, originalOptions, jqXHR) { ...

    jquer之ajaxQueue简单实现代码

    没什么复杂的东西,就是用个array对象来做队列,维护ajax请求的顺序。下面给出代码: 代码如下: ;(function($) { $.ajaxQueue = { // 管理ajax请求的队列 requests: new Array(), // 把待发送的ajax请求加入队列 ...

    ajax跨域懒加载图片

    Ajax请求这个文件,获取所有需要加载的图片URL。JSON格式便于数据传输和解析,是常见的API返回格式。 实现步骤大致如下: 1. 在`index.html`中设置图片元素,并将真实的URL存入`data-src`。 2. 在`imageurl.js`中...

    AJAX FAQ for the Java Developer.doc

    解决这一问题的方法之一是在服务器端实施请求队列,确保请求按顺序处理。另一种策略是在客户端使用Promise或async/await语法来管理异步流程,避免回调地狱。 14. **服务器端与AJAX客户端的交互** 为了支持AJAX...

Global site tag (gtag.js) - Google Analytics