ES6 - Promsie

promsie是異步編程的一種解決方案肩祥,總得來說promise是一個(gè)對象萍膛,從它可以獲取異步操作的消息雨让。它具備以下兩個(gè)特點(diǎn):

  • 對象的狀態(tài)不受外界影響。promise對象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中),fulfilled(已成功)和rejected(失敗)夹纫。只有異步操作的結(jié)果咽瓷,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作無法改變這個(gè)promise舰讹。
  • 一旦狀態(tài)改變茅姜,就不會(huì)改變,任何時(shí)候都可以得到這個(gè)結(jié)果月匣。promise只有兩種過度狀態(tài)
    pending => fulfilled钻洒,pending =>rejected。
    后續(xù)resolved統(tǒng)一只指fulfilled狀態(tài)锄开。

注意:無法取消promise素标,一旦新建立即執(zhí)行,無法中途取消
常用用法
Promise 構(gòu)造函數(shù)接受一個(gè)函數(shù)作為參數(shù)萍悴,我們可以看下示例

const promise = new Promise(function(resolve,reject){
    if(成功) {
       resolve(2);  //將狀態(tài)pending ->成功
       console.log(1); // 這個(gè)會(huì)先執(zhí)行头遭,因?yàn)閞esolve()是在本輪事件的末尾執(zhí)行,總是晚于本輪循環(huán)的同步
    } else {
       reject(New Error('fail')); //將狀態(tài)pending ->失敗
    }
})
promise.then(function(value){
  //success
  console.log(value); //2
},function(error){
 // failure
  console.log(error);
})
  • then方法返回的是一個(gè)新的promsie實(shí)列癣诱,所以可以采用鏈?zhǔn)綄懛莆磘hen方法后面再調(diào)用then。
  • 一般來說調(diào)用resolve和reject以后撕予,Promise使命就完成了享潜,所以建議直接return resolve或return reject;

catch
通常我們寫promise嗅蔬,估計(jì)很多人平時(shí)都沒寫這個(gè)剑按,這個(gè)因?yàn)槲覀儫o法保證這個(gè)promise實(shí)例運(yùn)行正常,所以需要一個(gè)方法來指定發(fā)生錯(cuò)誤時(shí)的回調(diào)(注意可以不是reject)澜术;

getJSON('/posts.json').then(function(posts){
     // getJSON()方法返回一個(gè) Promise 對象,resolve狀態(tài)執(zhí)行這個(gè)回調(diào)
     console.log('resolved')
 }).catch(function(error){
    // Promise 對象拋出錯(cuò)誤艺蝴,就會(huì)被catch捕獲
     console.log('發(fā)生錯(cuò)誤!',error)
})

promise對象錯(cuò)誤具有冒泡性質(zhì)

getJSON('/post/1.json').then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  // 處理前面三個(gè)Promise產(chǎn)生的錯(cuò)誤
});

一般來說,不要在then()方法里面定義 Reject 狀態(tài)的回調(diào)函數(shù)(即then的第二個(gè)參數(shù))鸟废,總是使用catch方法猜敢。

// bad
promise
  .then(function(data) {
    // success
  }, function(err) {
    // error // 不可以捕獲成功回調(diào)里的錯(cuò)誤
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error 可以捕獲到then里面執(zhí)行的錯(cuò)誤
  });

catch()方法返回的還是一個(gè) Promise 對象,因此后面還可以接著調(diào)用then()方法盒延。

finally
finally()方法用于指定不管 Promise 對象最后狀態(tài)如何缩擂,都會(huì)執(zhí)行的操作。

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···}); 

finally方法注意沒有參數(shù)添寺,不依賴于Promise的執(zhí)行結(jié)果,不管掐面是fulfilled還是rejected狀態(tài)胯盯,都不會(huì)影響他的執(zhí)行,其實(shí)本質(zhì)上是then方法的特列

promise
.finally(() => {
  // 語句
});

// 等同于
promise
.then(
  result => {
    // 語句
    return result;
  },
  error => {
    // 語句
    throw error;
  }
);

下面簡單的講幾個(gè)常用的promise方法

  • Promsie.all([p1,p2,p3]) 用于多個(gè)promise實(shí)例,包裝成一個(gè)新的Promsie计露,接受具有 Iterator 接口博脑,且返回的每個(gè)成員都是 Promise 實(shí)例的參數(shù)(常見就是數(shù)組)憎乙。全成功則成功,一個(gè)失敗則會(huì)失敗叉趣。

小提問泞边?如果promise.all()其中中間有一個(gè)或者多個(gè)錯(cuò)誤,我還是想執(zhí)行成功后的回調(diào)疗杉,怎么辦
給每個(gè)Promise實(shí)例都定義catch方法

  • Promise.race([p1, p2, p3]); 阵谚,只要p1、p2烟具、p3之中有一個(gè)實(shí)例率先改變狀態(tài)椭蹄,這個(gè)實(shí)例的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值净赴,就傳遞給p的回調(diào)函數(shù)

后續(xù)還有挺多的方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罩润,一起剝皮案震驚了整個(gè)濱河市玖翅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌割以,老刑警劉巖金度,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異严沥,居然都是意外死亡猜极,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門消玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跟伏,“玉大人,你說我怎么就攤上這事翩瓜∈馨猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵兔跌,是天一觀的道長勘高。 經(jīng)常有香客問我,道長坟桅,這世上最難降的妖魔是什么华望? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮仅乓,結(jié)果婚禮上赖舟,老公的妹妹穿的比我還像新娘。我一直安慰自己夸楣,他們只是感情好建蹄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布碌更。 她就那樣靜靜地躺著,像睡著了一般洞慎。 火紅的嫁衣襯著肌膚如雪痛单。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天劲腿,我揣著相機(jī)與錄音旭绒,去河邊找鬼。 笑死焦人,一個(gè)胖子當(dāng)著我的面吹牛挥吵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花椭,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼忽匈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矿辽?” 一聲冷哼從身側(cè)響起丹允,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袋倔,沒想到半個(gè)月后雕蔽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宾娜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年批狐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前塔。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚣艇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出华弓,到底是詐尸還是另有隱情髓废,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布该抒,位于F島的核電站慌洪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凑保。R本人自食惡果不足惜冈爹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欧引。 院中可真熱鬧频伤,春花似錦、人聲如沸芝此。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岸更,卻和暖如春鸵膏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怎炊。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工谭企, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人评肆。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓债查,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓜挽。 傳聞我的和親對象是個(gè)殘疾皇子盹廷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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

  • 1. Promise 的含義 所謂Promise,簡單說就是一個(gè)容器久橙,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)...
    ROBIN2015閱讀 483評論 0 0
  • 前言 本文旨在簡單講解一下javascript中的Promise對象的概念俄占,特性與簡單的使用方法。并在文末會(huì)附上一...
    _暮雨清秋_閱讀 2,190評論 0 3
  • Promise 含義 Promise 是異步編程的一種解決方案剥汤,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)...
    Upcccz閱讀 215評論 0 0
  • //本文內(nèi)容起初摘抄于 阮一峰 作者的譯文,用于記錄和學(xué)習(xí)排惨,建議觀者移步于原文 概念: 所謂的Promise吭敢,...
    曾經(jīng)過往閱讀 1,231評論 0 7
  • async 函數(shù) 含義 ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便暮芭。 async函數(shù)對 ...
    Xyaleo閱讀 1,088評論 0 4