es6Promise學習筆記

Promise 是異步編程的一種解決方案巷懈,ES6 將其寫進了語言標準,統(tǒng)一了用法览绿,原生提供了Promise對象策严。
有了Promise對象,就可以將異步操作以同步操作的流程表達出來饿敲,避免了層層嵌套的回調函數(shù)妻导。

特點

  • 對象的狀態(tài)不受外界影響。Promise對象代表一個異步操作怀各,有三種狀態(tài):pending(進行中)倔韭、resolved(已完成,又稱 Fulfilled)和rejected(已失斊岸浴)寿酌。只有異步操作的結果,可以決定當前是哪一種狀態(tài)硕蛹,任何其他操作都無法改變這個狀態(tài)醇疼。
  • 一旦狀態(tài)改變,就不會再變法焰,任何時候都可以得到這個結果秧荆。
    Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閞esolved和從pending變?yōu)閞ejected壶栋。
  • 一旦新建它就會立即執(zhí)行辰如。

構造函數(shù)

Promise對象是一個構造函數(shù),用來生成Promise實例贵试。
構造函數(shù)接受一個函數(shù)作為參數(shù)琉兜,該函數(shù)的兩個參數(shù)分別是resolve和reject,它們是兩個函數(shù)毙玻。
resolve函數(shù)的作用是將Promise對象的狀態(tài)從pending變?yōu)閞esolved豌蟋,并將異步操作的結果,作為參數(shù)傳遞出去桑滩。
reject函數(shù)的作用是將Promise對象的狀態(tài)從pending變?yōu)閞ejected梧疲,并將異步操作報出的錯誤,作為參數(shù)傳遞出去运准。

let promise = new Promise(function(resolve, reject) {
  console.log("Promise")
  resolve(42)
})

promise.then(function(value) {
  console.log("resolved" + value)
})

console.log("Hi!")
// Promise
// Hi!
// resolved42

實例方法

  • then()
    then方法的第一個參數(shù)是resolved狀態(tài)的回調函數(shù)幌氮,第二個參數(shù)(可選)是rejected狀態(tài)的回調函數(shù)。
    返回的是一個新的Promise實例胁澳,因此可以采用鏈式寫法该互。
  • catch()
    catch方法是.then(null, rejection)的別名,用于指定發(fā)生錯誤時的回調函數(shù)韭畸。
    catch方法返回的還是一個 Promise 對象宇智,因此可以采用鏈式寫法蔓搞。
    Promise 對象的錯誤具有“冒泡”性質,會一直向后傳遞随橘,直到被捕獲為止喂分。也就是說,錯誤總是會被下一個
    catch捕獲机蔗。
    一般來說蒲祈,不要在then方法里面定義 rejected 狀態(tài)的回調函數(shù)(即then的第二個參數(shù)),總是使用catch方法萝嘁。
  • finally()
    用于指定不管 Promise 對象最后狀態(tài)如何讳嘱,都會執(zhí)行的操作。finally方法的回調函數(shù)不接受任何參數(shù)酿愧。
      let promise = new Promise(function (resolve, reject) {
        resolve(42)
      })
    
      promise.then(function (value) {
        console.log("resolved" + value)
      })
      promise.catch(function (error) {
        console.log("rejected" + error)
      })
      promise.finally(function () {
        console.log("finally")
      })
     //resolved42  finally
    

靜態(tài)方法

  • Promise.all()
    用于將多個 Promise 實例沥潭,包裝成一個新的 Promise 實例。
    該方法參數(shù)必須具有 Iterator 接口嬉挡,且返回的每個成員都是 Promise 實例钝鸽。
    只有每個Promise實例的狀態(tài)變?yōu)閞esolved,返回的新的 Promise 實例狀態(tài)才會變成resolved庞钢。
    相反拔恰,只要有一個Promise實例的狀態(tài)變?yōu)閞ejected, 則整個Promise.all調用會立即終止基括,并返回一個rejected的新的promise對象颜懊。
const p1 = new Promise((resolve, reject) => {
    resolve('hello');
  })
  .then(result => result)
  .catch(e => e);

const p2 = new Promise((resolve, reject) => {
    reject('報錯了');
  })
  .then(result => result)

Promise.all([p1, p2])
  .then(result => console.log('success' + result))
  .catch(e => console.log('error' + e));
//error報錯了

注意點:如果作為參數(shù)的 Promise 實例,自己定義了catch方法风皿,那么它一旦被rejected河爹,并不會觸發(fā)Promise.all()的catch方法。

  • Promise.race()
    同樣是將多個 Promise 實例桐款,包裝成一個新的 Promise 實例咸这。
    方法的參數(shù)與Promise.all方法一樣。
    只要有一個實例的狀態(tài)發(fā)生變化魔眨,該函數(shù)就會返回媳维,并使用這個promise對象的值進行resolve或者reject。
const p1 = new Promise((resolve, reject) => {
    setTimeout(() => resolve('hello'), 2000)
  })
  .then(result => result)
const p2 = new Promise((resolve, reject) => {
    setTimeout(() => reject('world'), 4000)
  })
  .then(result => result)

Promise.race([p1, p2])
  .then(result => console.log('success' + result))
  .catch(e => console.log('error' + e));
// successhello


const p1 = new Promise((resolve, reject) => {
    setTimeout(() => reject('hello'), 2000)
  })
  .then(result => result)
  .catch(e => e)
const p2 = new Promise((resolve, reject) => {
    setTimeout(() => reject('world'), 4000)
  })
  .then(result => result)

Promise.race([p1, p2])
  .then(result => console.log('success' + result))
  .catch(e => console.log('error' + e
// successhello
//p1首先狀態(tài)變?yōu)閞ejected遏暴,然后調用自己的catch方法侄刽,返回一個新的Promise 實例(狀態(tài)為resolved),
//所以Promise.race()返回的Promise 實例狀態(tài)為resolved朋凉,調用then方法州丹,所以輸出仍然是successhello。

注意點:如果作為參數(shù)的 Promise 實例侥啤,自己定義了catch方法当叭,那么它一旦被rejected,并不會觸發(fā)Promise.race()的catch方法盖灸。

  • Promise.resolve()
    返回一個新的 Promise 實例蚁鳖,該實例的狀態(tài)由參數(shù)決定。
    • 如果參數(shù)是 Promise 實例赁炎,那么Promise.resolve將不做任何修改醉箕、原封不動地返回這個實例。
    • 如果參數(shù)是一個thenable對象徙垫,那么Promise.resolve會將這個對象轉為 Promise 對象讥裤,然后就立即執(zhí)行thenable對象的then方法。
    • 如果參數(shù)是其他或者不帶參數(shù)姻报,那么返回一個新的 Promise 實例己英,該實例的狀態(tài)為resolved。
Promise.resolve('foo')     等價于    new Promise(resolve => resolve('foo'))
const p2 = new Promise((resolve, reject) => {
    reject('world')
  })
  .then(result => result)
let p3 = Promise.resolve(p2)
console.log(p3 === p2)   //  true   原封不動地返回p2

let thenable = {
  then: function (resolve, reject) {
    reject(42);
  }
};

let p1 = Promise.resolve(thenable);
p1.then(function (value) {
  console.log('then' + value); 
});
p1.catch(function (error) {
  console.log('catch' + error);   
  // catch42  Promise.resolve將thenable轉為Promise對象吴旋,
  //然后執(zhí)行thenable的then方法损肛,Promise對象的狀態(tài)變?yōu)閞ejected,所以執(zhí)行p1.catch方法荣瑟。
});
  • Promise.reject()
    返回一個新的 Promise 實例治拿,該實例的狀態(tài)為rejected。
const p = Promise.reject('出錯了');  等同于  const p = new Promise((resolve, reject) => reject('出錯了'))
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末笆焰,一起剝皮案震驚了整個濱河市劫谅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚷掠,老刑警劉巖捏检,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異不皆,居然都是意外死亡未檩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門粟焊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冤狡,“玉大人,你說我怎么就攤上這事项棠”ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵香追,是天一觀的道長合瓢。 經常有香客問我,道長透典,這世上最難降的妖魔是什么晴楔? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任顿苇,我火速辦了婚禮,結果婚禮上税弃,老公的妹妹穿的比我還像新娘纪岁。我一直安慰自己,他們只是感情好则果,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布幔翰。 她就那樣靜靜地躺著,像睡著了一般西壮。 火紅的嫁衣襯著肌膚如雪遗增。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天款青,我揣著相機與錄音做修,去河邊找鬼。 笑死抡草,一個胖子當著我的面吹牛缓待,可吹牛的內容都是我干的。 我是一名探鬼主播渠牲,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼旋炒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了签杈?” 一聲冷哼從身側響起瘫镇,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎答姥,沒想到半個月后铣除,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鹦付,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年尚粘,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲长。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡禾乘,死狀恐怖昼牛,靈堂內的尸體忽然破棺而出圈暗,到底是詐尸還是另有隱情壮韭,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布辑鲤,位于F島的核電站盔腔,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜弛随,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一瓢喉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舀透,春花似錦栓票、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哆窿。三九已至链烈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挚躯,已是汗流浹背强衡。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留码荔,地道東北人漩勤。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像缩搅,于是被迫代替她去往敵國和親越败。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案硼瓣,比傳統(tǒng)的解決方案——回調函...
    neromous閱讀 8,703評論 1 56
  • Promiese 簡單說就是一個容器究飞,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果,語法上說堂鲤,Pr...
    雨飛飛雨閱讀 3,352評論 0 19
  • 1. Promise 的含義 所謂Promise亿傅,簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個...
    ROBIN2015閱讀 486評論 0 0
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,490評論 0 8
  • 不為浮世利名動瘟栖,一剃一刮到白頭葵擎。 百年終乘鶴西去,唯留京華匠人心半哟。
    關志峰閱讀 142評論 0 0