<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        認(rèn)識(shí)jQuery的Promise的具體使用方法

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:28:18
        文檔

        認(rèn)識(shí)jQuery的Promise的具體使用方法

        認(rèn)識(shí)jQuery的Promise的具體使用方法:先前了解了ES6的Promise對(duì)象,來看看jQuery中的Promise,也就是jQuery的Deferred對(duì)象。 打開瀏覽器的控制臺(tái)先。 <script> var defer = $.Deferred(); console.log(defer); </script> 運(yùn)行結(jié)果: 和ES6的
        推薦度:
        導(dǎo)讀認(rèn)識(shí)jQuery的Promise的具體使用方法:先前了解了ES6的Promise對(duì)象,來看看jQuery中的Promise,也就是jQuery的Deferred對(duì)象。 打開瀏覽器的控制臺(tái)先。 <script> var defer = $.Deferred(); console.log(defer); </script> 運(yùn)行結(jié)果: 和ES6的

        先前了解了ES6的Promise對(duì)象,來看看jQuery中的Promise,也就是jQuery的Deferred對(duì)象。

        打開瀏覽器的控制臺(tái)先。

        <script>
         var defer = $.Deferred();
         console.log(defer);
        </script>

        運(yùn)行結(jié)果:

         

        和ES6的Promise對(duì)象長(zhǎng)的有點(diǎn)像,jQuery的Deferred對(duì)象也有resolve、reject、then方法,還有done、fail、always......方法。jQuery就是用這個(gè)Deferred對(duì)象來注冊(cè)異步操作的回調(diào)函數(shù),修改并傳遞異步操作的狀態(tài)。

        玩玩Deferred:

        <script>
         function runAsync(){
         var defer = $.Deferred();
         //做一些異步操作
         setTimeout(function(){
         console.log('執(zhí)行完成');
         defer.resolve('異步請(qǐng)求成功之后返回的數(shù)據(jù)');
         }, 1000);
         return defer;
         }
         runAsync().then(function(data){
         console.log(data)
         });
        </script>
        
        

        運(yùn)行之后,Deferred對(duì)象的實(shí)例defer通過resolve方法把參數(shù) “異步請(qǐng)求成功之后返回的數(shù)據(jù)” 傳回到then方法中進(jìn)行接收,,打印。

        和ES6的Promise相似,但是有一點(diǎn)點(diǎn)區(qū)別,再看下Promise:

        <script>
         function runAsync(){
         var p = new Promise(function(resolve, reject){
         
         setTimeout(function(){
         console.log('執(zhí)行完成');
         resolve('異步請(qǐng)求成功之后返回的數(shù)據(jù)');
         }, 1000);
         });
         return p; 
         }
        
         runAsync().then(function(data){
         console.log(data);
         });
        </script>
        
        

        我們發(fā)現(xiàn):

        1、創(chuàng)建Deferred對(duì)象的時(shí)候沒有傳參;而創(chuàng)建Promise對(duì)象的時(shí)候,傳了參數(shù)(傳了一個(gè)匿名函數(shù),函數(shù)也有兩個(gè)參數(shù):resolve、reject);

        2、Deferred對(duì)象直接調(diào)用了resolve方法;而Promise對(duì)象則是在內(nèi)部調(diào)用的resolve方法;

        說明:Deferred對(duì)象本身就有resolve方法,而Promise對(duì)象是在構(gòu)造器中通過執(zhí)行resolve方法,給Promise對(duì)象賦上了執(zhí)行結(jié)果的狀態(tài)。

        這樣就有一個(gè)弊端:因?yàn)镈eferred對(duì)象自帶resolve方法,拿到Deferred對(duì)象之后,就可以隨時(shí)調(diào)用resolve方法,其狀態(tài)可以進(jìn)行手動(dòng)干預(yù)了

        <script>
         function runAsync(){
         var defer = $.Deferred();
         //做一些異步操作
         setTimeout(function(){
         console.log('執(zhí)行完成');
         defer.resolve('異步請(qǐng)求成功之后返回的數(shù)據(jù)');
         }, 1000);
         return defer;
         }
           var der = runAsync();
           der.then(function(data){
         console.log(data)
           });
           der.resolve('在外部結(jié)束'); 
        </script>
        
        

         這樣的話就直接在外部直接給Deferred設(shè)置了狀態(tài),打印“在外部結(jié)束”,1s后打印“執(zhí)行完成”,不會(huì)打印“異步請(qǐng)求成功之后返回的數(shù)據(jù)”了。

        顯然,這不好。我發(fā)個(gè)異步請(qǐng)求,還沒收到數(shù)據(jù)就讓人在外部給我結(jié)束了。。。。

        當(dāng)然這個(gè)坑jQuery肯定會(huì)填的,在Deferred對(duì)象上有一個(gè)promise方法,是一個(gè)受限的Deferred對(duì)象

        <script>
         function runAsync(){
         var def = $.Deferred();
         //做一些異步操作
         setTimeout(function(){
         console.log('執(zhí)行完成');
         def.resolve('請(qǐng)求成功之后返回的數(shù)據(jù)');
         }, 2000);
         return def.promise(); //就在這里調(diào)用
         }
        </script>

        所謂受限的Deferred對(duì)象,就是沒有resolve和reject方法的Deferred對(duì)象。這樣就無法在外邊改變Deferred對(duì)象的狀態(tài)了。

        Deferred對(duì)象的then方法和done、fail語法糖

        我們知道,在ES6的Promise規(guī)范中,then方法接受兩個(gè)參數(shù),分別是執(zhí)行完成和執(zhí)行失敗的回調(diào),而jquery中進(jìn)行了增強(qiáng),還可以接受第三個(gè)參數(shù),就是在pending狀態(tài)時(shí)的回調(diào),如下:

        deferred.then( doneFilter [, failFilter ] [, progressFilter ] )

        then方法:

        <script>
         function runAsync(){
         var def = $.Deferred();
         //做一些異步操作
         setTimeout(function(){
         var num = Math.ceil(Math.random()*10); //生成1-10的隨機(jī)數(shù)
         if(num<=5){
         def.resolve(num);
         }
         else{
         def.reject('數(shù)字太大了');
         }
         }, 2000);
         return def.promise(); //就在這里調(diào)用
         }
        
         runAsync().then(function(d){
         console.log("resolve");
         console.log(d);
         },function(d){
         console.log("reject");
         console.log(d);
         })
        
        </script>
        
        

        Deferred對(duì)象的then方法也是可以進(jìn)行鏈?zhǔn)讲僮鞯摹?/p>

        done,fail語法糖,分別用來指定執(zhí)行完成和執(zhí)行失敗的回調(diào),與這段代碼是等價(jià)的:

        <script>
         function runAsync(){
         var def = $.Deferred();
         //做一些異步操作
         setTimeout(function(){
         var num = Math.ceil(Math.random()*10); //生成1-10的隨機(jī)數(shù)
         if(num<=5){
         def.resolve(num);
         }
         else{
         def.reject('數(shù)字太大了');
         }
         }, 2000);
         return def.promise(); //就在這里調(diào)用
         }
        
         runAsync().done(function(d){
         console.log("resolve");
         console.log(d);
         }).fail(function(d){
         console.log("reject");
         console.log(d);
         })
        
        </script>
        
        

        always的用法

        jquery的Deferred對(duì)象上還有一個(gè)always方法,不論執(zhí)行完成還是執(zhí)行失敗,always都會(huì)執(zhí)行,有點(diǎn)類似ajax中的complete。

        $.when的用法

        jquery中,還有一個(gè)$.when方法來實(shí)現(xiàn)Promise,與ES6中的all方法功能一樣,并行執(zhí)行異步操作,在所有的異步操作執(zhí)行完后才執(zhí)行回調(diào)函數(shù)。不過$.when并沒有定義在$.Deferred中,看名字就知道,$.when,它是一個(gè)單獨(dú)的方法。與ES6的all的參數(shù)稍有區(qū)別,它接受的并不是數(shù)組,而是多個(gè)Deferred對(duì)象,如下:

        <script>
         function runAsync(){
         var def = $.Deferred();
         //做一些異步操作
         setTimeout(function(){
         var num = Math.ceil(Math.random()*10); //生成1-10的隨機(jī)數(shù)
         def.resolve(num); 
         }, 2000);
         return def.promise(); //就在這里調(diào)用
         }
         $.when(runAsync(), runAsync(), runAsync()) .then(function(data1, data2, data3){
             console.log('全部執(zhí)行完成');
             console.log(data1, data2, data3);
          });
        </script>

        jquery中沒有像ES6中的race方法嗎?就是以跑的快的為準(zhǔn)的那個(gè)方法。對(duì)的,jquery中沒有。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        認(rèn)識(shí)jQuery的Promise的具體使用方法

        認(rèn)識(shí)jQuery的Promise的具體使用方法:先前了解了ES6的Promise對(duì)象,來看看jQuery中的Promise,也就是jQuery的Deferred對(duì)象。 打開瀏覽器的控制臺(tái)先。 <script> var defer = $.Deferred(); console.log(defer); </script> 運(yùn)行結(jié)果: 和ES6的
        推薦度:
        標(biāo)簽: 方法 使用 教程
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久精品九九亚洲精品天堂| 毛片网站免费在线观看| 亚洲日韩涩涩成人午夜私人影院| 亚洲欧好州第一的日产suv| 99久久免费国产香蕉麻豆| 4444亚洲国产成人精品| 最近中文字幕2019高清免费| 亚洲视频精品在线| 国产精品成人免费福利| 亚洲午夜无码久久久久小说| 在线免费观看一级毛片| 亚洲6080yy久久无码产自国产| 日韩视频免费在线| 人禽伦免费交视频播放| 亚洲中文字幕不卡无码| 久草免费手机视频| 亚洲中文久久精品无码1| 精品国产一区二区三区免费看| 香港特级三A毛片免费观看| 亚洲乱码精品久久久久..| 99视频在线精品免费| 中文字幕亚洲男人的天堂网络| 永久黄网站色视频免费观看| 91av免费在线视频| 久久亚洲AV无码精品色午夜| 四虎在线免费播放| 岛国精品一区免费视频在线观看 | 精品亚洲国产成AV人片传媒| 97免费人妻在线视频| 亚洲色大情网站www| 亚洲国产日韩成人综合天堂| 亚欧日韩毛片在线看免费网站| 波多野结衣亚洲一级| 亚洲av无码乱码在线观看野外 | 亚洲乱妇老熟女爽到高潮的片| 波多野结衣免费视频观看| 国产一级淫片a免费播放口| 日本亚洲色大成网站www久久| 一本久到久久亚洲综合| 99精品一区二区免费视频| 亚洲AV无码一区二区三区性色|