国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
當前位置: 首頁 - 科技 - 知識百科 - 正文

認識jQuery的Promise的具體使用方法

來源:懂視網 責編:小采 時間:2020-11-27 22:28:18
文檔

認識jQuery的Promise的具體使用方法

認識jQuery的Promise的具體使用方法:先前了解了ES6的Promise對象,來看看jQuery中的Promise,也就是jQuery的Deferred對象。 打開瀏覽器的控制臺先。 <script> var defer = $.Deferred(); console.log(defer); </script> 運行結果: 和ES6的
推薦度:
導讀認識jQuery的Promise的具體使用方法:先前了解了ES6的Promise對象,來看看jQuery中的Promise,也就是jQuery的Deferred對象。 打開瀏覽器的控制臺先。 <script> var defer = $.Deferred(); console.log(defer); </script> 運行結果: 和ES6的

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

打開瀏覽器的控制臺先。

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

運行結果:

 

和ES6的Promise對象長的有點像,jQuery的Deferred對象也有resolve、reject、then方法,還有done、fail、always......方法。jQuery就是用這個Deferred對象來注冊異步操作的回調函數,修改并傳遞異步操作的狀態。

玩玩Deferred:

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

運行之后,Deferred對象的實例defer通過resolve方法把參數 “異步請求成功之后返回的數據” 傳回到then方法中進行接收,,打印。

和ES6的Promise相似,但是有一點點區別,再看下Promise:

<script>
 function runAsync(){
 var p = new Promise(function(resolve, reject){
 
 setTimeout(function(){
 console.log('執行完成');
 resolve('異步請求成功之后返回的數據');
 }, 1000);
 });
 return p; 
 }

 runAsync().then(function(data){
 console.log(data);
 });
</script>

我們發現:

1、創建Deferred對象的時候沒有傳參;而創建Promise對象的時候,傳了參數(傳了一個匿名函數,函數也有兩個參數:resolve、reject);

2、Deferred對象直接調用了resolve方法;而Promise對象則是在內部調用的resolve方法;

說明:Deferred對象本身就有resolve方法,而Promise對象是在構造器中通過執行resolve方法,給Promise對象賦上了執行結果的狀態。

這樣就有一個弊端:因為Deferred對象自帶resolve方法,拿到Deferred對象之后,就可以隨時調用resolve方法,其狀態可以進行手動干預了

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

 這樣的話就直接在外部直接給Deferred設置了狀態,打印“在外部結束”,1s后打印“執行完成”,不會打印“異步請求成功之后返回的數據”了。

顯然,這不好。我發個異步請求,還沒收到數據就讓人在外部給我結束了。。。。

當然這個坑jQuery肯定會填的,在Deferred對象上有一個promise方法,是一個受限的Deferred對象

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

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

Deferred對象的then方法和done、fail語法糖

我們知道,在ES6的Promise規范中,then方法接受兩個參數,分別是執行完成和執行失敗的回調,而jquery中進行了增強,還可以接受第三個參數,就是在pending狀態時的回調,如下:

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

then方法:

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

 runAsync().then(function(d){
 console.log("resolve");
 console.log(d);
 },function(d){
 console.log("reject");
 console.log(d);
 })

</script>

Deferred對象的then方法也是可以進行鏈式操作的。

done,fail語法糖,分別用來指定執行完成和執行失敗的回調,與這段代碼是等價的:

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

 runAsync().done(function(d){
 console.log("resolve");
 console.log(d);
 }).fail(function(d){
 console.log("reject");
 console.log(d);
 })

</script>

always的用法

jquery的Deferred對象上還有一個always方法,不論執行完成還是執行失敗,always都會執行,有點類似ajax中的complete。

$.when的用法

jquery中,還有一個$.when方法來實現Promise,與ES6中的all方法功能一樣,并行執行異步操作,在所有的異步操作執行完后才執行回調函數。不過$.when并沒有定義在$.Deferred中,看名字就知道,$.when,它是一個單獨的方法。與ES6的all的參數稍有區別,它接受的并不是數組,而是多個Deferred對象,如下:

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

jquery中沒有像ES6中的race方法嗎?就是以跑的快的為準的那個方法。對的,jquery中沒有。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

認識jQuery的Promise的具體使用方法

認識jQuery的Promise的具體使用方法:先前了解了ES6的Promise對象,來看看jQuery中的Promise,也就是jQuery的Deferred對象。 打開瀏覽器的控制臺先。 <script> var defer = $.Deferred(); console.log(defer); </script> 運行結果: 和ES6的
推薦度:
標簽: 方法 使用 教程
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 中文字幕一区二区三区久久网站 | 日韩精品一区二区三区国语自制 | 国产精品亚洲专区在线观看 | 一区二区亚洲视频 | 国产成人高清一区二区私人 | 国产 日韩 欧美在线 | 国产一区二区在线观看视频 | 欧美日韩国产一区 | 亚洲欧美另类第一页 | 欧美日韩电影在线观看 | 国产精品成人一区二区1 | 日韩精品123| 一级毛片真人不卡免费播 | 国产精品久久久久国产精品 | 亚洲欧美日韩高清一区二区三区 | 国产偷窥女洗浴在线观看 | 日韩第一页在线观看 | 亚洲欧美日韩天堂 | 久久经典视频 | 亚洲欧美色欧另类欧 | 日韩精选 | 欧美日韩极品 | 久久激情综合网 | 亚洲精品自产拍在线观看app | 精品久久久久中文字幕日本 | 日本一区二区视频在线观看 | 精品日韩欧美国产一区二区 | 成人久久久久久 | 亚洲v日韩v欧美在线观看 | a色视频| 性殴美 | 91精品国产91久久久久久最新 | 欧美日韩国产另类一区二区三区 | 亚洲欧美日韩另类 | 日韩欧美一卡二区 | 91精品国产乱码久久久久久 | 91亚洲国产成人久久精品网站 | 国产成人亚洲综合91精品555 | 亚洲欧美日韩高清中文在线 | 亚洲色图欧美在线 | 国产资源免费 |