ES6之Promise對象

本文大部分內(nèi)容是阮一峰老師的文章,這里搬過來也是為了自己記錄,想看更加詳細(xì)的教程請移步阮一峰老師個人博客

1.Promise.prototype.then()

then方法返回的是一個新的Promise實例(注意,不是原來那個Promise實例)。因此可以采用鏈?zhǔn)綄懛ǎ?code>then()方法后面再調(diào)用另一個 then()方法瑞躺。

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

采用鏈?zhǔn)降? then ,可以指定一組按照次序調(diào)用的回調(diào)函數(shù)屡拨。這時丈攒,前一個回調(diào)函數(shù),有可能返回的還是一個Promise對象(即有異步操作)渣淳,這時后一個回調(diào)函數(shù)脾还,就會等待該Promise對象的狀態(tài)發(fā)生變化伴箩,才會被調(diào)用入愧。

getJSON("/post/1.json").then(function(post) {
  return getJSON(post.commentURL);
}).then(function funcA(comments) {
  console.log("resolved: ", comments);
}, function funcB(err){
  console.log("rejected: ", err);
});

上面代碼中,第一個then方法指定的回調(diào)函數(shù)嗤谚,返回的是另一個Promise對象棺蛛。這時,第二個then()方法指定的回調(diào)函數(shù)巩步,就會等待這個新的Promise對象狀態(tài)發(fā)生變化旁赊。如果變?yōu)?code>resolved,就調(diào)用funcA椅野,如果狀態(tài)變?yōu)?code>rejected终畅,就調(diào)用funcB籍胯。

上面代碼對應(yīng)的更簡潔的箭頭函數(shù)寫法為:

getJSON("/post/1.json").then(
  post => getJSON(post.commentURL)
).then(
  comments => console.log("resolved: ", comments),
  err => console.log("rejected: ", err)
);

看下面一個使用的綜合案例

   let pro = new Promise(function(resolve,reject){

        if(true){
            //調(diào)用操作成功方法
            resolve('操作成功');
        }else{
            //調(diào)用操作異常方法
            reject('操作異常');
        }
    });

    //用then處理操作成功,catch處理操作異常
    pro.then(requestA)
        .then(requestB)
        .then(requestC)
        .catch(requestError);

    function requestA(){
        console.log('請求A成功');
        return '請求B离福,下一個就是你了';
    }
    function requestB(res){
        console.log('上一步的結(jié)果:'+res);
        console.log('請求B成功');
        return '請求C杖狼,下一個就是你了';
    }
    function requestC(res){
        console.log('上一步的結(jié)果:'+res);
        console.log('請求C成功');
    }
    function requestError(){
        console.log('請求失敗');
    }

    //打印結(jié)果:
    //請求A成功
    //上一步的結(jié)果:請求B,下一個就是你了
    //請求B成功
    //上一步的結(jié)果:請求C妖爷,下一個就是你了
    //請求C成功

案例中蝶涩,先是創(chuàng)建一個實例,還聲明了4個函數(shù)絮识,其中三個是分別代表著請求A绿聘,請求B,請求C次舌;有了then方法熄攘,三個請求操作再也不用層層嵌套了。我們使用then方法彼念,按照調(diào)用順序鲜屏,很直觀地完成了三個操作的綁定,并且国拇,如果請求B依賴于請求A的結(jié)果洛史,那么,可以在請求A的程序用使用return語句把需要的數(shù)據(jù)作為參數(shù)酱吝,傳遞給下一個請求也殖,案例中我們就是使用return實現(xiàn)傳遞參數(shù)給下一步操作的。

Promise.all( )方法

Promise.all( )方法:接受一個數(shù)組作為參數(shù)务热,數(shù)組的元素是Promise實例對象忆嗜,當(dāng)參數(shù)中的實例對象的狀態(tài)都為fulfilled時,Promise.all( )才會有返回崎岂。

//創(chuàng)建實例pro1
    let pro1 = new Promise(function(resolve){
        setTimeout(function () {
            resolve('實例1操作成功');
        },5000);
    });
    
    //創(chuàng)建實例pro2
    let pro2 = new Promise(function(resolve){
        setTimeout(function () {
            resolve('實例2操作成功');
        },1000);
    });

    
    Promise.all([pro1,pro2]).then(function(result){
        console.log(result);
    });
    //打印結(jié)果:["實例1操作成功", "實例2操作成功"]

上述案例捆毫,我們創(chuàng)建了兩個Promise實例:pro1和pro2,我們注意兩個setTimeout的第二個參數(shù)冲甘,分別是5000毫秒和1000毫秒绩卤,當(dāng)我們調(diào)用Promise.all( )方法的時候,會延遲到5秒才控制臺會輸出結(jié)果江醇。

因為1000毫秒以后濒憋,實例pro2進入了成功fulfilled狀態(tài);此時陶夜,Promise.all( )還不會有所行動凛驮,因為實例pro1還沒有進入成功fulfilled狀態(tài);等到了5000毫秒以后条辟,實例pro1也進入了成功fulfilled狀態(tài)黔夭,Promise.all( )才會進入then方法宏胯,然后在控制臺輸出:["實例1操作成功","實例2操作成功"]。

這個方法有什么用呢本姥?一般這樣的場景:我們執(zhí)行某個操作胳嘲,這個操作需要得到需要多個接口請求回來的數(shù)據(jù)來支持,但是這些接口請求之前互不依賴扣草,不需要層層嵌套了牛。這種情況下就適合使用Promise.all( )方法,因為它會得到所有接口都請求成功了辰妙,才會進行操作鹰祸。

Promise.race( )方法

另一個類似的方法是Promise.race()方法:它的參數(shù)要求跟Promise.all( )方法一樣,不同的是密浑,它參數(shù)中的promise實例蛙婴,只要有一個狀態(tài)發(fā)生變化(不管是成功fulfilled還是異常rejected),它就會有返回尔破,其他實例中再發(fā)生變化街图,它也不管了。

    //初始化實例pro1
    let pro1 = new Promise(function(resolve){
        setTimeout(function () {
            resolve('實例1操作成功');
        },4000);
    });

    //初始化實例pro2
    let pro2 = new Promise(function(resolve,reject){
        setTimeout(function () {
            reject('實例2操作失敗');
        },2000);
    });

    Promise.race([pro2,pro1]).then(function(result){
        console.log(result);
    }).catch(function(error){
        console.log(error);
    });
    //打印結(jié)果:實例2操作失敗

同樣是兩個實例懒构,實例pro1不變餐济,不同的是實例pro2,這次我們調(diào)用的是失敗函數(shù)reject胆剧。

由于pro2實例中2000毫秒之后就執(zhí)行reject方法絮姆,早于實例pro1的4000毫秒,所以最后輸出的是:實例2操作失敗秩霍。

以上就是對Promise對象的內(nèi)容講解篙悯,上面提到了一個概念:回調(diào)地獄;指的是過多地使用回調(diào)函數(shù)嵌套铃绒,使得調(diào)試和維護起來極其的不便鸽照。

參考:微信文章教你如何使用ES6的Promise對象
https://segmentfault.com/a/1190000002928371
http://www.cnblogs.com/tugenhua0707/p/7337022.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颠悬,隨后出現(xiàn)的幾起案子矮燎,更是在濱河造成了極大的恐慌,老刑警劉巖椿疗,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏峰,死亡現(xiàn)場離奇詭異糠悼,居然都是意外死亡届榄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門倔喂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铝条,“玉大人靖苇,你說我怎么就攤上這事“噻郑” “怎么了贤壁?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵忧设,是天一觀的道長溉旋。 經(jīng)常有香客問我,道長岖食,這世上最難降的妖魔是什么莹妒? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任名船,我火速辦了婚禮,結(jié)果婚禮上旨怠,老公的妹妹穿的比我還像新娘渠驼。我一直安慰自己,他們只是感情好鉴腻,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布迷扇。 她就那樣靜靜地躺著,像睡著了一般爽哎。 火紅的嫁衣襯著肌膚如雪蜓席。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天课锌,我揣著相機與錄音瓮床,去河邊找鬼。 笑死产镐,一個胖子當(dāng)著我的面吹牛隘庄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播癣亚,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丑掺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了述雾?” 一聲冷哼從身側(cè)響起街州,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玻孟,沒想到半個月后唆缴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡黍翎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年面徽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡趟紊,死狀恐怖氮双,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霎匈,我是刑警寧澤戴差,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站铛嘱,受9級特大地震影響暖释,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜墨吓,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一饭入、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肛真,春花似錦谐丢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至历极,卻和暖如春窄瘟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趟卸。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工蹄葱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锄列。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓图云,卻偏偏與公主長得像,于是被迫代替她去往敵國和親邻邮。 傳聞我的和親對象是個殘疾皇子竣况,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Promise的含義: ??Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和...
    呼呼哥閱讀 2,172評論 0 16
  • Promiese 簡單說就是一個容器筒严,里面保存著某個未來才會結(jié)束的事件(通常是一個異步操作)的結(jié)果丹泉,語法上說,Pr...
    雨飛飛雨閱讀 3,361評論 0 19
  • 能夠用到很多異步處理的回調(diào)函數(shù)之中鸭蛙,而且支持鏈?zhǔn)秸{(diào)用摹恨,主要是pending/resolved/rejected這三...
    芒僧閱讀 217評論 0 0
  • 2017.05.11 姓名:代利云 公司:寧波慈星股份有限公司 寧波盛和塾《六項精進》235期學(xué)員。 【日精進打卡...
    代利云閱讀 150評論 0 0
  • 總是要將情緒放大娶视,就好像娛樂圈的緋聞一樣晒哄,也許只是一個心情的小插曲都會被掰成N種畫風(fēng)惡性傳播。 近來,越來越感覺自...
    先生筆記閱讀 871評論 0 4