博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【jQuery】deferred对象了解
阅读量:6186 次
发布时间:2019-06-21

本文共 3055 字,大约阅读时间需要 10 分钟。

deferred对象就是jQuery的回调函数解决方案,在英语中,defer的意思是"延迟",所以deferred对象的含义就是"延迟"到未来某个点再执行。

它解决了如何处理耗时操作的问题,对那些操作提供了更好的控制,以及统一的编程接口。

1.首先,回顾一下jQuery的ajax操作的传统写法:

  $.ajax({    url: "test.html",    success: function(){      alert("哈哈,成功了!");    },    error:function(){      alert("出错啦!");    }  });

在上面的代码中,$.ajax()接受一个对象参数,这个对象包含两个方法:success方法指定操作成功后的回调函数,error方法指定操作失败后的回调函数。

现在,新的写法是这样的:

 $.ajax("test.html")  .done(function(){ alert("哈哈,成功了!"); })  .fail(function(){ alert("出错啦!"); });

可以看到,done()相当于success方法,fail()相当于error方法。采用链式写法以后,代码的可读性大大提高。

2.deferred对象的一大好处,就是它允许你自由添加多个回调函数。

 $.ajax("test.html")  .done(function(){ alert("哈哈,成功了!");} )  .fail(function(){ alert("出错啦!"); } )  .done(function(){ alert("第二个回调函数!");} );

回调函数可以添加任意多个,它们按照添加顺序执行。

3.deferred对象的另一大好处,就是它允许你为多个事件指定一个回调函数,这是传统写法做不到的。

$.when() 函数提供一种方法来执行一个或多个对象的回调函数。

如果向 jQuery.when 传入一个延迟对象,那么会返回它的 Promise 对象(延迟方法的一个子集)。 可以继续绑定 Promise 对象的其它方法,

例如, defered.then 。当延迟对象已经被受理(resolved) 或被拒绝(rejected)(通常是由创建延迟对象的最初代码执行的),那么就会调用相应的回调函数。

  $.when($.ajax("test1.html"), $.ajax("test2.html"))  .done(function(){ alert("哈哈,成功了!"); })  .fail(function(){ alert("出错啦!"); });

这段代码的意思是,先执行两个操作$.ajax("test1.html")和$.ajax("test2.html"),如果都成功了,就运行done()指定的回调函数;如果有一个失败或都失败了,就执行fail()指定的回调函数。

4.deferred对象的最大优点,就是它把这一套回调函数接口,从ajax操作扩展到了所有操作。也就是说,任何一个操作----不管是ajax操作还是本地操作,也不管是异步操作还是同步操作----都可以使用deferred对象的各种方法,指定回调函数。

$.Deferred([fun])

$.Deferred()没有参数时 返回Deferred对象;
有参数时,表示在这个参数上做延迟或异步操作,并且返回Deferred对象.

5.deferred.resolve()方法和deferred.reject()方法

jQuery规定,deferred对象有三种执行状态----未完成,已完成和已失败。如果执行状态是"已完成"(resolved),deferred对象立刻调用done()方法指定的回调函数;如果执行状态是"已失败",调用fail()方法指定的回调函数;如果执行状态是"未完成",则继续等待,或者调用progress()方法指定的回调函数(jQuery1.7版本添加)。

前面部分的ajax操作时,deferred对象会根据返回结果,自动改变自身的执行状态;但是,在自定义的函数中,这个执行状态必须由程序员手动指定。dtd.resolve()的意思是,将dtd对象的执行状态从"未完成"改为"已完成",从而触发done()方法。

  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("出错啦!"); });

类似的,还存在一个deferred.reject()方法,作用是将dtd对象的执行状态从"未完成"改为"已失败",从而触发fail()方法。

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

6.deferred.promise()方法

dtd是一个全局对象,所以它的执行状态可以从外部改变

deferred.promise()方法的作用是,在原来的deferred对象上返回另一个deferred对象,后者只开放与改变执行状态无关的方法(比如done()方法和fail()方法),屏蔽与改变执行状态有关的方法(比如resolve()方法和reject()方法),从而使得执行状态不能被改变。

7.另一种防止执行状态被外部改变的方法,是使用deferred对象的建构函数$.Deferred()。

jQuery规定,$.Deferred()可以接受一个函数名(注意,是函数名)作为参数,$.Deferred()所生成的deferred对象将作为这个函数的默认参数。

8.还可以直接在wait对象上部署deferred接口。

9.then()

then()的作用也是指定回调函数,它可以接受三个参数,也就是三个回调函数。第一个参数是resolve时调用的回调函数,第二个参数是reject时调用的回调函数,第三个参数是progress()方法调用的回调函数

参考链接

deferred.promise():

转载于:https://www.cnblogs.com/yujihang/p/6858598.html

你可能感兴趣的文章
C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9
查看>>
Android之Picasso --zz
查看>>
【JSON 注解】JSON循环引用1-----Jackson常用注解介绍 eq:@JsonIgnore
查看>>
Linux产生随机数的几种常见方法
查看>>
iOS:使用Github托管自己本地的项目代码方式三(命令行方式: Terminal Line)
查看>>
django的中间件
查看>>
文档数据库MongoDB
查看>>
李洪强经典面试题53-Swift
查看>>
Lua基础语法讲解
查看>>
Fastjson-fastjson中$ref对象重复引用问题
查看>>
Django application as a stand-alone desktop application at finally{}
查看>>
一文盘点MWC 2019所有5G设备和研发进展
查看>>
亚马逊发布新的AWS Step Functions集成
查看>>
面试时,面试官到底在考察什么?
查看>>
为什么不断做迁移,那是在还技术债
查看>>
量子计算竞速时代,如何拨动时间的指针
查看>>
Netflix:当你按下“播放”的时候发生了什么?
查看>>
Docker再曝安全漏洞,这次是PWD的问题
查看>>
Java工程师的成长路线图是什么?
查看>>
MySQL · B+树并发控制机制的前世今生
查看>>