中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

jQuery的promise與deferred對象在異步回調中的作用
來源:易賢網 閱讀:908 次 日期:2016-07-06 10:42:57
溫馨提示:易賢網小編為您整理了“jQuery的promise與deferred對象在異步回調中的作用”,方便廣大網友查閱!

這篇文章主要介紹了jQuery的promise與deferred對象在異步回調中的作用,需要的朋友可以參考下

一、前言

為了讓前端們從回調的地獄中回到天堂, jQuery 也引入了 Promise 的概念。 Promise 是一種令代碼異步行為更加優雅的抽象,有了它,我們就可以像寫同步代碼一樣去寫異步代碼。 jQuery 從1.5版本開始實現了 CommonJS Promise/A 規范這一重量級方案,不過沒有嚴格按照規范進行實現,有一些API上的差異。

好,讓我們來看看他們的特性吧( 本文示例基于jquery 1.8版本以上 )。

二、示例

以前寫動畫時,我們通常是這么干的:

$('.animateEle').animate({

 opacity:'.5'

}, 4000,function(){

 $('.animateEle2').animate({

  width:'100px'

 },2000,function(){

  // 這樣太傷了

  $('.animateEle3').animate({

   height:'0'

  },2000);

 });

});

假如這么使用回調的話,那就太傷了。幸好,還有一些現成的 Promise 解決方案來優雅地解決這種問題。

我們看看 jQuery 提供的解決辦法。

var animate1 = function() {

 return $('.animateEle1').animate({opacity:'.5'},4000).promise();

};

var animate2 = function() {

 return $('.animateEle2').animate({width:'100px'},2000).promise();

};

var animate3 = function(){

 return $('.animateEle3').animate({height:'0'},2000).promise();

};

// so easy,有木有,so clear,有木有

$.when(animate1()).then(animate2).then(animate3);

很明顯,更改后的代碼更易懂易讀了。

但是,上面的代碼,有些細節的東西并沒有透露,一不小心,就容易出錯,得不到我們想要的順序完成動畫的效果。下面讓我們來全面理解 jQuery 提供的 promise 和 deferred 對象的方法,看看到底如何使用。

三、promise和deffered對象方法

promise 對象其實就是 deferred 對象的特例,因為 promise 對象不能更改異步狀態,而 deferred 對象可以。這點在他們的方法設計上,有著明顯的體現。

1.promise對象方法

通常,對于DOM,動畫,ajax相關方法,我們都可以使用 promise 方法。調用 promise 方法,返回的是 promise 對象??梢枣準秸{用 promise 方法。

promise對象常見的方法有三個 : done , fail , then 。

其它的方法就不要去記了, jquery 這里的接口方法太多了,在我看來挺啰嗦的,就跟早期的事件方法綁定一樣, live , delegate , bind ,最終不是都歸為 on 來管了么。

代碼示例,如下:

(1)DOM使用 promise 方法:

var box=$('#box');

box.promise().done(function(ele){

  console.log(ele);//jQuery box

});

(2)Ajax使用 promise 方法(默認返回一個 promise 對象,所以可以不必顯式調用 promise 方法):

$.post('/',{}).done(function(data){

  console.log('請求成功');

}).fail(function(){

  console.log('請求錯誤');

});

動畫示例已有,就不重復列出了。

2.deferred對象方法

那么Deferred和Promise之間有什么區別呢?正如你在前面看到的,一個promise就是一個由異步函數返回的對象。當你想要自己編寫一個這樣的函數時你需要使用一個deferred。

一個deferred對象能做的和一個promise對象差不多,但是它有兩個函數來觸發done()和fail()函數。

一個deferred對象擁有一個resolve()函數來處理一個成功的結果并執行與done()相關的函數。reject()函數則用來處理失敗的結果并執行與fail()相關的函數。

你可以給resolve()和reject()函數都提供參數,然后它們都將傳遞給與done()和fail()相關的回調函數。

promise對象沒有resolve()和reject()函數。這是因為你將promise放到了其他的腳本中并且你也不想promise去resolve或者reject一個promise。

下面是一個關于deferred的簡單例子。html僅僅是一個簡單的擁有id屬性為”result”的空div。

$('#result').html('waiting...');

var promise = wait();

promise.done(result);

function result() {

 $('#result').html('done');

}

function wait() {

 var deferred = $.Deferred();

 setTimeout(function() {

  deferred.resolve();

 }, 2000);

 return deferred.promise();

}  

其中,wait()函數返回了一個promise。它將在2s之后被解析。除了setTimeout之外,異步函數中所有的東西都能這樣使用,比如 動畫,Web worker等等。wait()函數中的代碼應該很清晰,我們使用了deferred對象,但是我們返回了一個限制的promise對象。

對于 deferred 對象呢,也就是使用 $.Deferred() 方法,以及 $.when() 等方法創造出來的對象,有如下的常用方法:

resolve , reject , notify ;

done , fail , progress ;

另外還有 promise 、 then 和 always 方法。

之所以這么排版,是因為他們是對應的,也就是說: resolve 方法會觸發 done 的回調執行, reject 會觸發 fail 的回調, notify 會觸發 progress 的回調。

直接看代碼:

var wait = function(ms) {

 var dtd = $.Deferred();

 setTimeout(dtd.resolve, ms);

 // setTimeout(dtd.reject, ms);

 // setTimeout(dtd.notify, ms);

 return dtd.promise(); //此處也可以直接返回dtd

};

wait(2500).done(function() {

 console.log('haha,師太,你可讓老衲久等了');

}).fail(function() {

 console.log('失敗了');

}).progress(function(res) {

 console.log('等待中...');

});

我們看到了,上面的代碼中,在 wait 函數中,返回的是個 promise 對象,而不是 deferred 對象。

要知道, promise 對象是沒有 resolve , reject , notify 等方法的,也就意味著,你無法針對 promise 對象進行狀態更改,只能在 done 或 fail 中進行回調配置。所以,你如果這么調用 wait(2500).resolve() 將會報錯,因為 wait(2500) 返回的是個 promise 對象,不存在 resolve 方法。

但是,這么做,有個好處,我們把 dtd 這個 deferred 對象放在了 wai t函數中,作為了局部變量,避免了全局的污染;進一步通過 promise 方法,轉化 dtd 這個 deferred 對象為 promise 對象,避免了函數 wait 外部可能發生的狀態更改(假如我們確實有這個需求)。

比如:

var wait = function(ms) {

 var dtd = $.Deferred();

 setTimeout(dtd.resolve, ms);

 // setTimeout(dtd.reject, ms);

 // setTimeout(dtd.notify, ms);

 return dtd; //此處也可以直接返回dtd

};

wait(2500).reject().fail(function(){

 console.log('失敗了...............');

});

我們在外部更改了 wait 返回的 deferred 對象的狀態,這樣必然觸發該對象的 fail 回調函數。

對于 always 方法,從字面意思上就很容易理解, deferred 對象無論是 resolve 還是 reject ,都會觸發該方法的回調。

3.其它共性

此處講講 then 和 $.when 方法的使用。它們對 promise 對象也適用。

$.when 方法接受多個 deferred 對象或者純javascript對象,返回 promise 對象。

then 方法依次接受三個回調,分別為 deferred 對象 resolve , reject , notify 后觸發的回調,返回一個 promise 對象。注意,必須傳入函數,而該函數只有返回一個 promise 對象,才能夠讓異步事件按照預期順序來執行。

我們來看看最開始的動畫示例代碼, $.when(animate1()).then(animate2).then(animate3) , $.when 方法中接受了一個 animate1 的函數執行結果,也就是得到了一個 promise 對象,而后的 then 中,則只是接受了一個變量名,這樣得到的結果是一個匿名的函數體,而該函數中返回的是 promise 對象。正好符合了我們對 then 接受參數的要求。

假如我們把執行語句改成: $.when(animate1()).then(animate2()).then(animate3()) ,這樣造成的結果就是三個動畫同步執行了。與 $.when(animate1(),animate2(),animate3()) 無異。

既然 then 是如此要求,那么與 then 方法類似的 done , fail , progress 也是一樣的。

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
好男人免费精品视频| 欧美在线免费一级片| 国产精品亚洲不卡a| 国产精品高精视频免费| 国产欧美日韩视频一区二区| 国产日韩精品一区二区三区在线| 国产自产女人91一区在线观看| 韩日欧美一区二区三区| 亚洲日本欧美| 亚洲自拍三区| 久久午夜精品一区二区| 欧美日韩一区不卡| 国产一区二区三区的电影| 亚洲乱码一区二区| 午夜一区不卡| 欧美福利视频一区| 国产精品视频导航| 91久久精品美女高潮| 亚洲图色在线| 欧美成人高清| 国产日产欧美精品| 亚洲国产婷婷| 久久国产加勒比精品无码| 欧美日韩国产亚洲一区 | 国产精品国产三级国产专播品爱网 | 欧美日韩另类视频| 国产一区二区三区高清在线观看| 亚洲精品国产精品乱码不99 | 99精品福利视频| 久久精品女人的天堂av| 欧美色中文字幕| 亚洲国产精品一区二区久| 欧美一区二区播放| 欧美三级特黄| 亚洲乱码一区二区| 美女国产一区| 久久久高清一区二区三区| 欧美日韩国产色综合一二三四| 国产在线欧美| 亚洲欧美高清| 国产精品v亚洲精品v日韩精品 | 午夜精品久久久| 欧美日本一区二区视频在线观看| 国内视频一区| 欧美一区二区三区在线| 欧美日韩一区二区三区高清| 在线观看成人一级片| 久久国产精品高清| 国产欧美日韩在线观看| 亚洲一区欧美二区| 国产精品久久久久999| 亚洲精品乱码久久久久久黑人| 久久亚洲综合色| 国产视频一区二区三区在线观看| 一区二区三区 在线观看视| 欧美激情在线观看| 亚洲精选久久| 欧美日韩国产欧| 亚洲免费福利视频| 欧美色播在线播放| 国产精品99久久久久久www| 欧美日韩一区二区高清| 一本久久知道综合久久| 欧美日韩国产一级片| 一本色道久久综合| 欧美日韩成人在线观看| 一区二区高清在线观看| 欧美日韩在线一二三| 9国产精品视频| 欧美日韩中国免费专区在线看| 亚洲天堂成人在线观看| 欧美小视频在线| 亚洲欧美日本国产专区一区| 国产一区二区欧美| 免费成人美女女| 99国产精品| 国产精品日韩精品欧美精品| 欧美在线二区| 精品999久久久| 欧美激情二区三区| 一区二区三区视频免费在线观看 | 玖玖综合伊人| 91久久在线视频| 欧美理论电影网| 亚洲视频在线一区| 国产欧美激情| 欧美 日韩 国产精品免费观看| 亚洲精品在线免费| 国产欧美精品日韩精品| 噜噜噜噜噜久久久久久91| 亚洲国产精品成人久久综合一区| 欧美日韩国产综合网| 午夜精品视频网站| 亚洲高清av在线| 国产精品国产三级国产aⅴ浪潮 | 亚洲九九爱视频| 国产精品多人| 女仆av观看一区| 亚洲综合色视频| 最新成人在线| 国产精品亚洲美女av网站| 久久视频在线免费观看| 亚洲图片欧美日产| 精品成人在线| 国产精品福利影院| 欧美国产91| 久久精品欧洲| 中文一区字幕| 国内一区二区在线视频观看| 欧美精品免费观看二区| 欧美一区二区在线视频| 亚洲精品一区二| 精品电影在线观看| 国产精品任我爽爆在线播放| 欧美福利视频网站| 久久久综合精品| 亚洲欧美视频一区| 亚洲九九九在线观看| 黄色精品一区| 国产精品久久午夜夜伦鲁鲁| 欧美精品啪啪| 久久久蜜桃精品| 欧美一区二区观看视频| 亚洲特级片在线| 日韩亚洲欧美精品| 亚洲国产成人久久综合| 国产亚洲欧洲一区高清在线观看| 国产精品xvideos88| 欧美激情va永久在线播放| 欧美中文字幕不卡| 亚洲图片欧美一区| 亚洲午夜国产一区99re久久| 亚洲人成久久| 亚洲高清自拍| 亚洲国产高清aⅴ视频| 黄色成人在线网站| 国产欧美亚洲一区| 国产精品美女午夜av| 欧美日韩一区二区三区在线看| 久热国产精品| 久久一区中文字幕| 久久久国产91| 久久久久91| 久久综合久色欧美综合狠狠| 久久综合网hezyo| 免费高清在线一区| 毛片一区二区| 欧美14一18处毛片| 欧美国产日韩精品| 欧美电影免费观看| 欧美激情在线观看| 欧美日韩一区二区免费在线观看| 欧美日韩精品一区二区三区| 欧美精品在线观看| 欧美日韩爆操| 国产精品久在线观看| 国产精品久久久久久久电影| 国产精品久久久对白| 国产精品欧美日韩| 国产乱码精品一区二区三| 国产一区二区三区在线播放免费观看 | 欧美精品观看| 欧美日韩国产系列| 亚洲欧洲日本mm| 亚洲一级黄色av| 羞羞视频在线观看欧美| 久久野战av| 欧美日韩三级一区二区| 国产精品成人播放| 国产午夜亚洲精品不卡| 在线观看视频一区二区| 亚洲欧洲中文日韩久久av乱码| 亚洲人成网站在线播| 亚洲视频视频在线| 欧美影院一区| 欧美bbbxxxxx| 欧美午夜视频网站| 国产在线一区二区三区四区 | 国产欧美一区二区三区另类精品 | 精品88久久久久88久久久| 日韩视频一区二区三区| 午夜精品福利在线| 欧美+亚洲+精品+三区| 欧美视频在线一区二区三区| 国产美女精品人人做人人爽| 亚洲高清视频的网址| 亚洲一区二区影院| 久久综合色综合88| 欧美性jizz18性欧美| 一区二区三区在线视频播放| 99在线|亚洲一区二区| 久久久99精品免费观看不卡| 欧美日韩国产页| 伊人精品久久久久7777| 亚洲视频免费在线| 欧美.www| 国内一区二区三区| 亚洲欧美国产毛片在线| 欧美日韩123| 亚洲高清在线播放|