我的编程空间,编程开发者的网络收藏夹
学习永远不晚

jQuery中Deferred的deferred.promise()方法怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

jQuery中Deferred的deferred.promise()方法怎么使用

这篇文章主要讲解了“jQuery中Deferred的deferred.promise()方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jQuery中Deferred的deferred.promise()方法怎么使用”吧!

deferred.promise() 和 .promise()

这两个API语法几乎一样,但是有着很大的差别。deferred.promise()是Deferred实例的一个方法,他返回一个Deferred.Promise实例。一个Deferred.Promise对象可以理解为是deferred对象的一个视图,它只包含deferred对象的一组方法,包括:done(),then(),fail(),isResolved(), isRejected(), always(),这些方法只能观察一个deferred的状态,而无法更改deferred对象的内在状态。这非常适合于API的封装。例如一个deferred对象的持有者可以根据自己的需要控制deferred状态的状态(resolved或者rejected),但是可以把这个deferred对象的Promise对象返回给其它的观察者,观察者只能观察状态的变化绑定相应的回调函数,但是无法更改deferred对象的内在状态,从而起到很好的隔离保护作用。

deferred.promise()

$(function(){   //   var deferred = $.Deferred();   var promise = deferred.promise();      var doSomething = function(promise) {     promise.done(function(){       alert('deferred resolved.');     });   };      deferred.resolve();   doSomething(promise); })


deferred.promise()也可以接受一个object参数,此时传入的object将被赋予Promise的方法,并作为结果返回。

// Existing object var obj = {  hello: function( name ) {   alert( "Hello " + name );  } }, // Create a Deferred defer = $.Deferred();  // Set object as a promise defer.promise( obj );  // Resolve the deferred defer.resolve( "John" );  // Use the object as a Promise obj.done(function( name ) {  this.hello( name ); // will alert "Hello John" }).hello( "Karl" ); // will alert "Hello Karl"

deferred.promise() 只是阻止其他代码来改变这个 deferred 对象的状态。可以理解成,通过 deferred.promise() 方法返回的 deferred promise 对象,是没有 resolve ,reject, progress , resolveWith, rejectWith , progressWith 这些可以改变状态的方法,你只能使用 done, then ,fail 等方法添加 handler 或者判断状态。

deferred.promise() 改变不了 deferred 对象的状态,作用也不是保证目前的状态不变,它只是保证你不能通过 deferred.promise() 返回的 deferred promise 对象改变 deferred 对象的状态。如果我们这个地方直接返回 dtd,也是可以工作的,.done 的处理函数还是会等到 dtd.resolve() 之后才会执行.

具体在那篇博客的例子, 如果我们把代码改成如下的形式:

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

这样的执行结果和先前返回 dtd.promise 的结果是一样的。

差别在什么地方呢?如果我们把 $.when 的这块的代码改成这样的:

var d = wait(dtd);$.when(d).done(function(){ alert("哈哈,成功了!"); }).fail(function(){ alert("出错啦!"); });d.resolve();

我们会发现 alert(“哈哈,成功了!”) 会立即执行,“执行完毕”却需要5秒后才弹出来。

但是如果我们 wait 函数最后是 return dtd.promise() 这里 d.resolve() 就会报错了,因为对象 d 不存在 resolve() 方法。

同样如果我们把代码改成:

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

我们也可以发现 alert(“哈哈,成功了!”) 会立即执行,因为 dtd 这个 deferred 对象在被传入 wait 之前,已经被 resolve() 了,而 deferred 对象一旦被 resolve 或者 reject 之后,状态是不会改变的。

然后我们再把 $.wait 这块的代码改成:

$.when( wait(dtd)).done(function(){ alert("哈哈,成功了!"); }).fail(function(){ alert("出错啦!"); });dtd.resolve();

我们也会发现 alert(“哈哈,成功了!”); 被立即执行,虽然 wait(dtd) 执行的时候, dtd 还没有被 resolve,而且 wait 方法返回的是 dtd.promise(), 但是 dtd 这个原始的 deferred 对象是暴露在外面的,我们还是可以从外面改变它的状态。

于是,如果我们真的不想让其他代码能改变 wait 方法内部的 deferred 对象的状态,那我们应该写成这样:

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

也就是不要把 deferred 直接暴露出来,最后返回 deferred.promise() ,让其他地方的代码只能添加 handler 。


.promise()

首先这不是Deferred实例的方法!该方法是jQuery实例的方法。该方法用于一组类型的动作(例如动画)全部完成后返回一个Promise对象,供事件监听器监听其状态并执行相应的处理函数。

该方法接受两个可选参数:.promise( [type,] [target] )

type:队列的类型,默认值是fx,fx即jQuery对象的动画.
targetObject :要赋予Promise行为的对象,

这两个参数是可选的。其中第一个参数(我)目前除了fx还没有找到其他的值类型。因此一般都是用于动画的监控,在动画完成后做一些操作。

例子:没有动画效果直接返回一个resolved状态的promise对象

var div = $( "<div />" ); div.promise().done(function( arg1 ) {  // 将会被马上触发  alert( this === div && arg1 === div ); });

例子:在动画效果全部完成后触发done()监听函数

<!DOCTYPE html> <html> <head>  <style> div {  height: 50px; width: 50px;  float: left; margin-right: 10px;  display: none; background-color: #090; } </style>  <script class="lazy" data-src="http://code.jquery.com/jquery-latest.js"></script> </head> <body>   <button>Go</button> <p>Ready...</p> <div></div> <div></div> <div></div> <div></div> <script> $("button").bind( "click", function() {  $("p").append( "Started...");  //每个div执行动画效果  $("div").each(function( i ) {   $( this ).fadeIn().fadeOut( 1000 * (i+1) );  });  //$("div")包含一组div,在所有的div都完成自己的动画效果后触发done()函数  $( "div" ).promise().done(function() {   $( "p" ).append( " Finished! " );  }); }); </script>  </body> </html>

感谢各位的阅读,以上就是“jQuery中Deferred的deferred.promise()方法怎么使用”的内容了,经过本文的学习后,相信大家对jQuery中Deferred的deferred.promise()方法怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

jQuery中Deferred的deferred.promise()方法怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

jQuery中Deferred的deferred.promise()方法怎么使用

这篇文章主要讲解了“jQuery中Deferred的deferred.promise()方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jQuery中Deferred的deferr
2023-07-04

jquery中的change方法怎么使用

在jQuery中,change方法用于绑定元素的change事件。change事件在元素的值发生改变时触发。使用change方法的语法如下:```javascript$(selector).change(function() {// 执行的
2023-08-09

jQuery中animate()方法怎么使用

animate()方法是jQuery中用于实现动画效果的方法。它可以改变元素的CSS属性值来创建动画。基本语法格式如下:```javascript$(selector).animate(styles, speed, easing, call
2023-08-18

jquery中的比较方法怎么使用

本文小编为大家详细介绍“jquery中的比较方法怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery中的比较方法怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述比较是Web应用程序中最常
2023-07-05

html()方法怎么在jQuery中使用

这期内容当中小编将会给大家带来有关html()方法怎么在jQuery中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的
2023-06-14

prop()方法怎么在JQuery中使用

今天就跟大家聊聊有关prop()方法怎么在JQuery中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库,它具
2023-06-14

slice()方法怎么在jQuery中使用

今天就跟大家聊聊有关slice()方法怎么在jQuery中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库,它
2023-06-14

is()方法怎么在JQuery中使用

is()方法怎么在JQuery中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独特的链式语
2023-06-14

prepend()方法怎么在jquery中使用

prepend()方法怎么在jquery中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。jquery是什么jquery是一个简洁而快速的JavaScript库,它具有独
2023-06-14

$.post()方法怎么在jQuery中使用

$.post()方法怎么在jQuery中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库
2023-06-14

show()方法怎么在jQuery中使用

今天就跟大家聊聊有关show()方法怎么在jQuery中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。jquery是什么jquery是一个简洁而快速的JavaScript库,它具
2023-06-14

eq()方法怎么在jquery中使用

本篇文章给大家分享的是有关eq()方法怎么在jquery中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。jquery是什么jquery是一个简洁而快速的JavaScript
2023-06-14

jQuery的removeClass()方法怎么使用

jQuery的removeClass()方法用于移除指定元素的一个或多个类。使用该方法的语法如下:```javascript$(selector).removeClass(classname);```其中,`selector`是要操作的元素
2023-09-05

jQuery的serializeArray()方法怎么使用

jQuery的serializeArray()方法用于序列化表单元素为一个对象数组。使用方法如下:1. 选择要序列化的表单元素,例如通过选择器选择一个表单元素或者表单元素中的特定元素。2. 调用serializeArray()方法。示例代码
2023-09-05

jQuery的each()方法怎么使用

jQuery的each()方法用于遍历集合中的每个元素,并对每个元素执行指定的函数。语法:```javascript$.each(collection, function(index, value){// 执行的代码});```参数说明:-
2023-09-05

jQuery的animate()方法怎么使用

jQuery的animate()方法用于执行元素的动画效果。它接受两个参数:目标样式和动画选项。1. 目标样式:可以是一个对象,其中包含要改变的CSS属性和目标值。例如:```javascript{width: '200px', heigh
2023-09-05

jQuery的fadeOut()方法怎么使用

jQuery的fadeOut()方法用于将匹配元素的透明度逐渐降低,从而实现淡出的效果。使用方法如下:1. 选择要淡出的元素,可以使用ID、类、标签等选择器方法。2. 使用fadeOut()方法来触发淡出动画,该方法可以接受三个参数:速度、
2023-10-11

jquery的toggle()方法怎么使用

本篇内容主要讲解“jquery的toggle()方法怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery的toggle()方法怎么使用”吧!toggle()方法可用于切换被选元素的
2023-07-05

jquery的trigger方法怎么使用

jQuery的trigger()方法用于触发指定的事件。它有两种用法:1. 通过事件类型触发事件:```javascript$(selector).trigger(eventType);```其中,selector是选择器,用于选中要触发事
2023-08-15

jQuery的children()方法怎么使用

jQuery的children()方法用于获取匹配元素的所有直接子元素。使用方法如下:```$(selector).children()```其中,selector为元素的选择器。示例:```html子元素1子元素2子元素3
2023-09-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录