亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 10:10:20
字體:
來源:轉載
供稿:網友

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 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> 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品va在线观看黑人| 亚洲欧美日韩一区二区在线| 久久国产精品久久国产精品| 97在线视频免费看| 欧美性开放视频| 97超视频免费观看| 欧美日韩精品中文字幕| 久久精品一本久久99精品| 欧美日韩国产一区二区三区| 揄拍成人国产精品视频| 麻豆乱码国产一区二区三区| 久久精品在线播放| 欧美大片网站在线观看| 欧美韩日一区二区| 永久免费毛片在线播放不卡| 日本精品久久电影| 久久精品99久久久久久久久| 日韩精品在线播放| 国产精品高精视频免费| 一个色综合导航| 国产成人涩涩涩视频在线观看| 国产91成人在在线播放| 亚洲免费视频观看| 一区二区三区国产在线观看| 美女性感视频久久久| 欧美日韩国产中文字幕| 不卡中文字幕av| 亚洲天堂男人天堂| 国产综合在线看| 中文字幕日韩欧美| 91精品国产亚洲| 久久精品国亚洲| 亚洲欧美日韩精品| 欧美影院久久久| 日韩av最新在线| 亚洲精品久久久久中文字幕欢迎你| 欧美一区二区三区艳史| 九九热这里只有精品免费看| 日韩电影免费观看在线| 国产精品午夜国产小视频| 深夜福利国产精品| 欧美激情在线观看| 亚洲直播在线一区| 日韩精品免费电影| 91精品啪在线观看麻豆免费| 91九色蝌蚪国产| 久久久久久久久久国产| 搡老女人一区二区三区视频tv| 国产精品青青在线观看爽香蕉| 亚洲天堂成人在线视频| 欧美一区二区大胆人体摄影专业网站| 日韩免费视频在线观看| 欧美黄色片在线观看| 久久久久久久久中文字幕| 国产一区二区三区在线播放免费观看| 精品在线小视频| 日韩欧美aⅴ综合网站发布| 日韩黄在线观看| 国产suv精品一区二区| 亚洲人高潮女人毛茸茸| 在线视频欧美性高潮| 国产精品久久久久秋霞鲁丝| 亚洲国产精品久久91精品| 日日骚av一区| 日韩精品在线电影| 国产亚洲人成a一在线v站| 亚洲性69xxxbbb| 成人免费视频a| 国语自产偷拍精品视频偷| 国产午夜精品一区理论片飘花| 欧美激情亚洲一区| 成人有码视频在线播放| 一本大道亚洲视频| 中文.日本.精品| 亚洲国产日韩欧美综合久久| 亚洲国产精品va在线观看黑人| 久久精品福利视频| 久久综合伊人77777| 亚洲毛片在线观看.| 色视频www在线播放国产成人| 亚洲系列中文字幕| 中文字幕亚洲情99在线| 美女扒开尿口让男人操亚洲视频网站| 亚洲最大福利视频网站| 黄网站色欧美视频| 狠狠色狠狠色综合日日小说| 久久精品精品电影网| 日韩高清电影好看的电视剧电影| 岛国视频午夜一区免费在线观看| 5566成人精品视频免费| 69久久夜色精品国产7777| 久久激情视频久久| 日韩电视剧在线观看免费网站| 成人免费在线视频网站| 欧美一级片免费在线| 欧美成人午夜免费视在线看片| 另类少妇人与禽zozz0性伦| 国产精品视频地址| 国产亚洲欧美视频| 亚洲男人的天堂在线| 狠狠躁夜夜躁人人躁婷婷91| 亚洲欧美资源在线| 中文字幕av日韩| 久久69精品久久久久久久电影好| 91精品国产沙发| 精品国产精品三级精品av网址| 欧美日韩在线视频首页| 伊人伊成久久人综合网站| 中文日韩在线视频| 国产国产精品人在线视| 国产成人免费av电影| 久久久久久久成人| 国产在线拍揄自揄视频不卡99| 91av福利视频| 在线日韩日本国产亚洲| 日韩中文字幕视频在线观看| 欧美精品福利在线| 国产欧美中文字幕| 亚洲国产另类久久精品| 国产在线精品成人一区二区三区| 国产脚交av在线一区二区| 欧美一区视频在线| 97在线视频观看| 欧美激情视频给我| 欧美自拍大量在线观看| 亚洲综合日韩中文字幕v在线| 久久中文久久字幕| 国产精品v日韩精品| 久久九九亚洲综合| 日韩精品一区二区三区第95| 亚洲人成绝费网站色www| 欧美成人免费网| 亚洲中国色老太| 国产精品人人做人人爽| 国产精品久久一区| 亚洲欧美日韩一区二区在线| 91精品视频观看| 51午夜精品视频| 福利一区福利二区微拍刺激| 欧美精品在线观看| 欧美日韩成人黄色| 最近2019中文字幕在线高清| 日韩网站在线观看| 欧美xxxx综合视频| 68精品国产免费久久久久久婷婷| 欧美成人免费播放| 亚洲精品久久久久久久久久久久| 欧美怡春院一区二区三区| 色一情一乱一区二区| 日韩视频免费中文字幕| 日韩视频免费中文字幕| 亚洲精品乱码久久久久久按摩观| 日韩高清电影免费观看完整版| 国产精品一区二区久久精品| 久久99热精品| 7777kkkk成人观看| 精品成人69xx.xyz| 国产91精品不卡视频| 日韩一区二区三区国产| 国产精品久久久久久久久久| 曰本色欧美视频在线| 亚洲影影院av| 欧美在线视频网站| 91大神在线播放精品|