`
snake_hand
  • 浏览: 624774 次
社区版块
存档分类
最新评论

利用 Jquery Deferred 异步你的程序

 
阅读更多

最近在做公司QA系统改造时,有这样的一个场景.

QA系统中有些数据项需要从JIRA平台(一个国外项目与事务跟踪工具)中获取,JIRA平台提供了很完善的Rest API.

现在的要求是,在QA系统中提交项目时,必须先从JIRA平台获取很多的数据项,每次请求的Rest API都不一样,

同时必须等所有请求都成功返回数据后才能提交项目.

因为之前对Jquery Deferred有过研究,发现这个场景用它来实现再合适不过了.

这里对Jquery Deferred不做过多讲解了,不了解的同学可以先看下面的文章.

http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

http://www.cnblogs.com/justany/archive/2013/01/20/2867444.html

 

好了,现在让我们来模拟上面的场景.(文章最后有完整DEMO下载)

假设我们获取数据项的请求全都由JqueryHandler.ashx来处理,在handler里面用Thread.Sleep()来模拟请求Rest API时的网络延迟.

 public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/json";

            string action = context.Request.Form["Action"];
            //用Thread.Sleep()模拟请求Rest API时的网络延迟
            switch (action)
            {
                case "delay1Seconds":
                    Thread.Sleep(2000);
                    WriteSuccess(context, action, "2");
                    break;
                case "delay2Seconds":
                    Thread.Sleep(1000);
                    WriteSuccess(context, action, "1");
                    break;
                case "delay3Seconds":
                    Thread.Sleep(3000);
                    WriteSuccess(context, action, "3");
                    break;
                default:
                    break;
            }
        }

        public void WriteSuccess(HttpContext context, string action, string seconds)
        {
            //输出JSON结果
            string index = context.Request.Form["Index"];
            string json = "{\"flag\":0,\"msg\":" + seconds + ",\"Index\":" + index + "}";
            context.Response.Write(json);
        }

 

数据服务端模拟好了之后,接下来让我们来发出获取数据项的请求.

    <script src="Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {

            $("#btn_Request").click(
                function () {
                    $("#div_Content").html("");

                    //模拟请求Handler地址
                    var requestUrl = "JqueryHandler.ashx";

                    //ajax请求 action名称数组
                    var requestInfoArr =
                    [
                      { Action: "delay1Seconds" },
                     { Action: "delay2Seconds" },
                     { Action: "delay3Seconds" }
                    ];

                    //用于保存Jquery Defered对象
                    var deferredOBJ = [];

                    //创建3个 Jquery Deferred 对象
                    //与3个对 JqueryHandler.ashx 的异步请求一 一对应
                    for (var i = 0; i < requestInfoArr.length; i++) {
                        deferredOBJ[i] = $.Deferred();

                        var jsonData = requestInfoArr[i];

                        //记录当前ajax请求的索引,方便后面找到对应的Jquery Deferred对象
                        jsonData.Index = i;

                        //发出ajax请求
                        $.ajax({
                            type: "POST",
                            dataType: "json",
                            url: requestUrl,
                            data: jsonData,
                            success: function (data, statu) {
                                //flag为0时表示请求成功
                                if (data.flag == 0) {
                                    var result = requestInfoArr[data.Index].Action + " 请求成功,耗时:" + data.msg + "秒";
                                    $("#div_Content").append($("<p/>").text(result));

                                    //根据前面传过去的索引找到对应Deferred对象,将状态改成resolve(表示成功)
                                    deferredOBJ[data.Index].resolve();
                                } else {
                                    // 如果请求出错,将状态改成reject (表示失败)
                                    //这里调用reject()后,会立即执行下面的fail()函数
                                    deferredOBJ[data.Index].reject(data.msg);
                                }
                            },
                            error: function (data, statu) {
                                alert("ajax请求获取数据失败!");
                            }
                        });
                    }

                    //使用$.when() 来控制3个异步请求的流程,保证所有异步请求都完成后再执行done函数
                    $.when(deferredOBJ[0], deferredOBJ[1], deferredOBJ[2])
                     .done(function () {
                         var result = "所有请求完成...";
                         $("#div_Content").append($("<p/>").text(result));
                     })
                     .fail(function (error) {
                         alert("从JIRA获取度量项数据失败, 请重试");
                     });

                });

        });
    </script>

 

这里的巧妙之处在于 jsonData.Index = i;  这句代码,不然要就要写3个ajax请求,代码会显得臃肿.

如果不记录当前请求索引的话,后面的success,error函数就无法找到对应的Deferred对象来改变状态.

可能大家会问,为什么不用deferredOBJ[i]来获取,这是因为请求都是异步的,在success,error函数里来获取 i 永远都是2(因为requestInfoArr.length是2).

 

让我们来验证一下这3个ajax请求是不是都是异步执行的.

 

用firebug可以看到3个ajax请求是同时发出的,这样3个请求只花了3.09s.

如果3个ajax请求是顺序执行的话就需要花费 2.03s+1.06s+3.09s=6.18s, 使用jquery deferred节约了一倍的时间.

 

最后附上程序运行截图和DEMO程序:

完整DEMO下载:Jquery Deferred

 
0
3
分享到:
评论

相关推荐

    谈谈jQuery之Deferred源码剖析

    ### jQuery之Deferred源码剖析知识点 #### 一、Deferred和Promise简介 jQuery的Deferred对象是jQuery在ES6的Promise...实际开发中,利用jQuery的Deferred可以极大地简化异步编程模型,提高代码的清晰度和运行效率。

    javascript异步处理与Jquery deferred对象用法总结

    本文实例讲述了javascript异步处理与Jquery deferred对象用法。分享给大家供大家参考,具体如下: 这是项目组老大整理的一些关于jquery 异步处理请求,以及使用 jquery deferred 对象的一些常见方法。虽然是项目上...

    jquery Deferred 快速解决异步回调的问题

    jQuery Deferred 是一个强大的工具,它解决了JavaScript中异步编程的一大挑战——回调地狱。在JavaScript的异步编程中,我们通常需要处理多个回调函数,当这些回调嵌套过深时,代码可读性和维护性会显著降低。jQuery...

    利用jQuery的deferred对象实现异步按顺序加载JS文件

    对jQuery中的deferred的用法了一些了解,今天看到园子里的一篇文章:关于重构JS前端框架的失败经验(顺便怀念那些死去的代码),于是把我之前写的一个利用jQuery的deferred异步按顺序加载JS文件方案分享出来,欢迎...

    jQuery通过deferred对象管理ajax异步

    自jQuery 1.5版本起,引入了一种强大的异步编程模式——deferred对象。这一机制允许开发者以更为优雅和灵活的方式处理异步操作,特别是针对复杂的AJAX请求。 首先,要理解什么是异步操作。在编程中,异步操作指的是...

    Deferred:Deferred JS 库 - JQuery Deferred 的替代品

    Deferred.JS 可以轻松处理异步进程(如AJAX等)。 Deferred.JS 是JQuery Deferred objects的替代品。 (行为与 JQuery Deferred 相同)。 阅读以了解为什么您应该从 JQuery Deferred 迁移到 Deferred.JS。 要从 ...

    jQuery异步访问

    jQuery 1.5引入了 Deferred 对象和 Promise API,使异步操作更易于管理。它们提供了链式调用、错误处理和多个异步操作的同步管理。 ### 七、跨域请求 通过设置 `xhrFields` 和 `crossDomain` 参数,jQuery支持跨域...

    jQuery的deferred对象使用详解

    总结而言,jQuery的deferred对象是处理异步操作的强大工具,能够简化代码结构,增强程序的可读性和可维护性。通过链式调用与回调函数的灵活管理,开发者能够更容易地控制异步流程,无论是在ajax操作中,还是在普通的...

    jQuery的deferred对象详解

    jQuery的deferred对象是为了解决在JavaScript编程中经常遇到的异步操作而设计的一个功能强大的解决方案。在开发网站的过程中,我们经常需要处理一些耗时很长的操作,这些操作可能是异步的,如ajax读取服务器数据,也...

    jquery异步调用方式深度婆媳与范蠡详解

    在JavaScript的世界里,jQuery库以其简洁的API和强大的功能,...通过理解这些基本概念和实践,你将能够更高效地利用jQuery进行异步编程,提升Web应用的用户体验。学习并掌握这些技术,将使你在开发过程中更加得心应手。

    HTML+CSS3+JS+JQuery实现七夕言情动画、面向对象程序设计、Deferred对象解决异步编程回调嵌套问题

    本篇文章将详细讲解如何利用这些技术实现七夕言情动画,以及面向对象程序设计和 Deferred 对象在解决异步编程回调嵌套问题中的应用。 首先,我们来看HTML和CSS3在七夕言情动画中的应用。HTML(超文本标记语言)是...

    jquery异步调用post get方式

    `jQuery`提供了`$.ajax()`, `$.post()`, 和 `$.get()`等方法来实现异步请求。本文将深入探讨`jQuery`中的`POST`和`GET`异步调用方式。 1. **GET方式** `GET`是最常见的HTTP请求方法,通常用于获取资源。在jQuery中...

    jQuery中的deferred对象和extend方法详解

    jQuery中的`deferred对象`和`extend方法`是JavaScript异步编程的重要工具,尤其在处理AJAX请求和其他异步操作时非常有用。`deferred对象`是jQuery 1.5.0版本引入的,它提供了一种更优雅的方式来管理回调函数,解决了...

    在jQuery 1.5中使用deferred对象的代码(翻译)

    jQuery中的Deferred对象是1.5版本引入的重要特性,它主要用于处理JavaScript中的异步编程模式。在传统编程中,异步操作的处理较为复杂,常常需要嵌套回调函数,使得代码难以阅读和维护。而Deferred对象提供了一种更...

    JQuery异步刷新

    jQuery提供`$.when()`和`$.deferred()`来管理异步操作的流程控制。`$.when()`可以监控多个异步请求的状态,当所有请求都完成时执行回调。`$.deferred()`则可以创建一个延迟对象,用于构建复杂的异步逻辑。 最后,...

    jquery1.83 之前所有与异步列队相关的模块详细介绍

    异步编程是JavaScript开发中一个非常重要的概念,它允许程序在等待诸如网络请求等长时间操作完成的同时,继续执行其它任务,避免了程序的阻塞。jQuery作为一个流行的JavaScript库,从1.5版本开始引入了 Deferred ...

    深入解析jQuery中Deferred的deferred.promise()方法

    在jQuery的世界里,异步编程的核心工具之一就是 Deferred 对象,它提供了一种优雅的方式来管理异步操作。本文将深入解析jQuery中 Deferred 的 `deferred.promise()` 方法,以及与 `.promise()` 的区别。 `deferred....

Global site tag (gtag.js) - Google Analytics