`

(转)实现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队列很简单,创建一个数组存储请求队列,数组中每一项又是一个请求参数数组,当用户执行请求时

    ajaxQueue:ajax请求队列

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

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

    第2种case 应用场景: 多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果。例如: 用户登录后我们发送一次请求得到用户的应用ID,然后利用应用ID发送一次请求得到具体的应用内容(例子虽然...

    jquer之ajaxQueue简单实现代码

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

    jQuery中借助deferred来请求及判断AJAX加载的实例讲解

    ajax请求异步队列加载 我们在开发程序的时候通常会碰到使用ajax加载数据显示到列表的情况。ajax默认使用异步加载(async:true)。为什么不使用同步呢,因为ajax同步加载会UI渲染线程阻塞的问题。通常表现为在加载...

    mybic_1_0_0.zip_BIC_My-BIC_mybic_json p_php xml_submission

    支持XML,JSON和TEXT的格式Ajax数据传输。...内置Submission队列:所有的AJAX请求将会发送到正确的顺序中,所有请求都会被存储在队列中防止被覆盖。提供一个帮助你在运行期进行调试的可视化操作界面。

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    经典类与新式类的继承顺序 继承实例讲解 多态实例讲解 本节作业之选课系统开发 第7周 心灵分享 上节回顾 静态方法、类方法、属性方法 课堂扯淡 深入讲解类的特殊成员方法__init__等 深入讲解类的特殊成员方法__new...

    jQuery权威指南-源代码

    由于本书的结构是层进式的,章节之间有一定的关联,因此建议读者按章节的编排顺序逐章阅读。但在阅读本书的示例时,请尽量不要照抄书中的所有示例,而是重在理解代码的实现思路,自己动手开发相似功能的应用,并...

    DWR.xml配置文件说明书(含源码)

    这种类型的creator采用BSF执行脚本语言并返回bean.例如 ... import org.apache.commons.validator.EmailValidator; return EmailValidator.getInstance(); ... 4 Signatures in dwr.xml Signatures...

    ASP EXCEL导入SQL

    AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又...

    jquery插件使用方法大全

    开发人员借此可以使用无法立即获得的返回值(如异步Ajax请求的返回结果),而且第一次能够附加多个事件处理器。 例如,使用了新的jQuery内部Ajax API就可以实现下面的代码了: // Assign handlers immediately ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    09 基于tcp实现远程执行命令测试结果 10 粘包现象 11 粘包解决方法 第31章 01 上节课复习 02 socketserver实现并发 03 socketserver模块介绍 04 socketserver源码分析tcp版本 05 socketserver源码分析udp版 06 ftp...

    jQuery详细教程

    • jQuery 的 action() 执行对元素的操作 示例 $(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有段落 $("p.test").hide() - 隐藏所有 class="test" 的段落 $("#test").hide() - 隐藏所有 id="test" 的元素 ...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

Global site tag (gtag.js) - Google Analytics