前端程序,以提高旅游(九)----延迟对象

近日,内部推荐计划。当进入项目首页。。依照以往的习惯,应该将调用接口后运行的代码,放入ajax请求success内运行。这样当然能够,可是代码组织和可读性都没有那么高。

通过查看Jquery官网api发现了deferred
object(延迟对象)这个概念。

   一、API文档的翻译:

   延迟对象,在jquery1.5被引入。是调用jQuery.Deferred()方法生成的一个链式功用对象。

它能够注冊多个回调到回调队列,提取回调队列,传递不论什么异步或同步函数的成功或失败状态。

延迟对象是一个链式的,类似于jquery对象的链式,可是它有自己的方法。

在创建之后。你能够用不论什么以下涉及到的方法,不管是直接链式调用,还是保存这个对象到变量。并在这个变量上调用一个或多个方法。

  • deferred.always()

    加入操作方法。无论延迟对象是处于解决状态还是拒绝状态都被调用。

  • deferred.done()

   加入操作方法。仅仅有延迟对象处于已解决状态才被调用

  • deferred.fail()

   加入操作方法,仅仅有延迟对象处于被拒绝状态才会被调用

  • deferred.isRejected()

    推断一个延迟对象是否处于被拒绝状态

  • deferred.isResolved()

    推断一个延迟对象是否处于已解决状态。

  • deferred.notify()

    调用一个给定变量的延迟对象上的进行中的回调。

  • deferred.notifyWith()

    调用一个给定变量和上下文的延迟对象上的进行中的回调。

  • deferred.pipe()

    用来过滤and或or链式延迟的效用方法

  • deferred.progress()

    当延迟对象生成进行中通知时,加入操作被调用。

  • deferred.promise()

    返回延迟允诺对象。

  • deferred.reject()

    拒绝一个延迟对象而且调用不论什么给定參数的失败回调。

  • deferred.rejectWith()

    拒绝回调对象。调用不论什么给定上下文和參数的失败回调。

  • deferred.resolve()

    解决一个延迟对象。而且调用不论什么给定參数的完毕回调。

  • deferred.resolveWith()

    解决一个延迟对象。而且调用不论什么给定上下文和參数的完毕回调。

  • deferred.state()

    推断当前延迟对象状态。

  • deferred.then()

   当延迟对象被解决、拒绝或进行中加入方法被调用。

  • jQuery.Deferred()

    延迟对象的构造函数。

  • jQuery.when()

    提供一个方法运行基于一个或多个对象的回调函数,回调函数常常是代表异步事件的延迟对象

  • .promise()

    当全部的绑定到集合、队列或没有的动作被完毕返回一个promise对象。

 
 二、延迟对象分析与使用:

   不难得出结论,以上API包含了延迟对象的构建、延迟状态设定方法、延迟状态监听方法。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluZ3lpbGVkaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

延迟对象的数据结构

    延迟对象包含三种状态:resolved(已解决)、rejected(未解决)、progress(进行中)。

这三种状态能够用延迟对象state方法实时查看。

延迟对象状态查看

   延迟对象是jquery的回调函数解决方式,延迟顾名思义就是延迟到未来某个点再运行,类似jquery 动画函数中delay方法,差别在于后者是延迟固定时间。延迟对象则是通过固定状态推断延迟运行的时机。

var dtd = $.Deferred(); // 新建一个deferred对象
  var wait = function(dtd){
    var tasks = function(){
      alert("运行完成!");
      dtd.resolve(); // 改变deferred对象的运行状态
    };
    setTimeout(tasks,5000);
    return dtd;
  };
$.when(wait(dtd))
  .done(function(){ alert("哈哈,成功了!

"); })
  .fail(function(){ alert("出错啦!

"); });

  上述代码运行流程图:

上述代码样例,延迟对象定义为一个全局对象。这样就会造成延迟状态。能够在不论什么时间进行更改。

   改进的方法一:

var dtd = $.Deferred(); // 新建一个Deferred对象
  var wait = function(dtd){
    var tasks = function(){
      alert("运行完成!");
      dtd.resolve(); // 改变Deferred对象的运行状态
    };

    setTimeout(tasks,5000);
    return dtd.promise(); // 返回promise对象,promise对象仅仅开放与状态无关的方法。即那三种状态方法不开放,无法设置
  };
  var d = wait(dtd); // 新建一个d对象。改为对这个对象进行操作
  $.when(d)
  .done(function(){ alert("哈哈,成功了!"); })
  .fail(function(){ alert("出错啦!

"); });
  d.resolve(); // 此时,这个语句是无效的

     上述代码,在wait函数返回值是一个promise对象,由下图promise对象数据结构不难发现,promise对象拥有除了改动状态方法以外延迟对象的全部方法,也就是说。promise对象无法改变运行状态,这样就行防止外界对状态的更改。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluZ3lpbGVkaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

promise对象的数据结构

改进方法二:

   将延迟对象构建成函数内部的局部变量,这样更好的实现了封装,防止外部对状态进行改变。

var wait = function(dtd){
    var dtd = $.Deferred(); //在函数内部,新建一个Deferred对象
    var tasks = function(){
      alert("运行完成!");
      dtd.resolve(); // 改变Deferred对象的运行状态
    };

    setTimeout(tasks,5000);
    return dtd.promise(); // 返回promise对象
  };
  $.when(wait())
  .done(function(){ alert("哈哈,成功了!"); })
  .fail(function(){ alert("出错啦!"); });

改进方法三:

直接将函数名作为$.Deferred()參数传入。$.Deferred()所生成的延迟对象会作为wait函数參数传入函数。

var wait = function(dtd){
    var tasks = function(){
      alert("运行完成。");
      dtd.resolve(); // 改变Deferred对象的运行状态
    };
    setTimeout(tasks,5000);
    return dtd.promise(); // 返回promise对象
  };
 $.Deferred(wait)
  .done(function(){ alert("哈哈,成功了。"); })
  .fail(function(){ alert("出错啦!

"); });

$.Deferred()方式运行状态

三、项目使用情况:

   乐帝在内推项目中使用的是另外一种方法,即将延迟对象作为局部变量定义,并返回promise对象。这里promise对象与延迟对象除了不能改变状态。对延迟状态的记录及监听方法都同样。

 function loadInternalHost() {
            var dtd = $.Deferred();
               dtd.resolve();
            return dtd.promise();//在原defferred对象上返回还有一个deferred对象。两个对象都会记录最初deferred对象状态,但后者不能改变状态,其它方法一致
        }

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWluZ3lpbGVkaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

promise对延迟状态的记录

    当分别调用两个接口时。延迟监听函数同意为多个事件指定一个回调。

    例如以下代码,分别取得内推城市及内推公告两部分数据后,运行兴许载入数据的动作。

$.when(getInternalRecommendCitys(), getComment()).done(function () {
                getInternalRecommendJobAdList(oldSearchData.keyWord, oldSearchData.locId);
            });
function getInternalRecommendCitys() {
            var dtd = $.Deferred();
            $.ajax({
                type: "get",
                data: {
                    "openId": openId
                },
                dataType: "json",
                url: "../api/InternalInfo/InternalRecommendCitys",
                success: function (data) {
                    $city = $("#citySelect");
                    for (var i = 1; i < data.length; i++) {
                        $str = $("<option></option>");
                        $str.text(data[i].name);
                        $str.val(data[i].value);
                        $city.append($str);
                        dtd.resolve();
                    }//将可选城市导入到选择列表
                },
                error: function () {
                    dtd.resolve();
                }
            });
            return dtd.promise();
        }
        function getComment() {
            var dtd = $.Deferred();
            $.ajax({
                type: "get",
                data: {
                    "openId": openId
                },
                dataType: "json",
                url: "../api/InternalInfo/GetComment",
                success: function (data) {
                    $(".notice-content pre").html(data.data);
                    dtd.resolve();
                },
                error: function () {
                    dtd.resolve();
                }
            });//获取公告数据
            return dtd.promise();
        }

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-13 10:53:05

前端程序,以提高旅游(九)----延迟对象的相关文章

前端编程提高之旅(九)----延迟对象

近日做内部推荐项目,在进入项目首页时,需要进行预调用接口判断,按照以往的习惯,应该将调用接口后执行的代码,放入ajax请求success内执行.这样当然可以,但是代码组织和可读性都没有那么高.通过查看Jquery官网api发现了deferred object(延迟对象)这个概念.    一.API文档的翻译:    延迟对象,在jquery1.5被引入,是调用jQuery.Deferred()方法生成的一个链式功用对象.它可以注册多个回调到回调队列,提取回调队列,传递任何异步或同步函数的成功或失

JS搞基指南----延迟对象入门提高资料整理

原文:JS搞基指南----延迟对象入门提高资料整理 JavaScript的Deferred是比较高大上的东西,  主要的应用还是主ajax的应用,  因为JS和nodeJS这几年的普及,  前端的代码越来越多,  各种回调套回调再套回调实在太让人崩溃, 所以就从后端拖了一个延迟对象这货, 用来解决回调地狱这个问题 .  我们使用ajax的时候多数都是为ajax添加回调 ,然后异步向服务器发送请求, 比如如下原生的XHR代码: <!DOCTYPE html PUBLIC "-//W3C//D

JavaScript学习总结(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

JavaScript学习总结(一)--延迟对象.跨域.模板引擎.弹出层.AJAX示例 目录 一.AJAX示例 1.1.优点 1.2.缺点 1.3.jQuery AJAX示例 二.延迟对象(Deferred) 2.1.回调函数 2.2.deferred.done 三.跨域 3.1.什么是跨域 3.2.JSONP跨域 3.3.jQuery使用JSONP跨域 3.4.跨域资源共享(CORS) 3.5.小结 四.弹出层 五.模板引擎 5.1.Hello World 5.2.方法 5.3.与AJAX结合应

JQ中的延迟对象deferred中的promise等的使用

一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的. 通常的做法是,为它们指定回调函数(callback).即事先规定,一旦它们运行结束,应该调用哪些函数. 但是,在回调函数方面,jQuery的功能非常弱.为了改变这一点,jQuery开发团队就设计了deferred对象. 简单说,deferred对象就是jQuery的回调函数

JavaScript学习总结(一)——AJAX、延迟对象、跨域、模板引擎

一.AJAX AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效果. 1.1.优点 不需要插件支持 优秀的用户体验 提高Web程序的性能 减轻服务器和带宽的负担 1.2.缺点 浏览器对XMLHttpRequest对象的支持度不足,几乎所有浏览器现在都支持 破坏浏览器“前进”.“后退”按钮的正常功能,可以通过简单的插件弥补 对搜索引擎的支持不足 1.3.jQuery

改善C#程序,提高程序运行效率的50种方法

改善C#程序,提高程序运行效率的50种方法 转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量)和const(编译时常量) 1.const只可用于基元类型.枚举.字符串,而readonly则可以是任何的类型: 2.const在编译时将替换成

&lt;转&gt;程序员如何要薪水以及为什么前端程序员应该拿高薪

今天有个前同事联系到我,抱怨现在好的前端程序员很缺,正好前几天五一的时候看到 Twitter 上很多人公开讨论自己的薪资,有一些感触.大部分程序员,尤其是前端,每天都要关注技术进展,几乎没时间关心别的,性格往往也不善言辞,老实巴交,凡事先反思自己的技术水平,所以我打算写这篇文章谈论一下薪水问题,希望对别人有些帮助. 首先简单介绍一下个人情况:本人之前在北京工作五年,技术能力平平,没多少谈论薪水的经验,相比之下薪水一直不高,好在不太在乎薪水,也有时间想这些乱七八糟的问题.现在离开行业也已经近两年,

2016年最新web前端程序员面试题

随着web前端开发的越来越火热,学习web前端开发的朋友也逐渐变多,学完之后面试web前端程序员(http://www.maiziedu.com/course/web-px/)时,面试官会提出一些面试题,那么面试官一般会问哪些前端开发面试题呢,小编整理了一份,仅供大家参考: 1. em  和 strong  的区别 em 表示强调,strong 表示更强烈的强调.言简意赅,表明了 em 和 strong 的命名来历.并且在浏览器中,em 默认用斜体表示,strong 用粗体表示 2.请用CSS实

jquery源码解析:jQuery延迟对象Deferred(工具方法)详解2

请接着上一课继续看. $.Deferred()方法中,有两个对象,一个是deferred对象,一个是promise对象. promise对象有以下几个方法:state,always,then,promise,pipe,done,fail,progress. deferred对象除了有promise对象的所有方法外(通过jQuery.extend( obj, promise ),把promise对象的所有方法复制到deferred对象中),还有其他三个:resolve,reject,notify.