ES6 promise

這里是一個重點大綱, promise的知識點比較復雜, 主要參考阮一峰的es6入門,具體知識點那里有非常完美的解釋。
promise通俗來講就是一個容器, 里面保存著某個未來才會結束的時事件(通常是一個一步操作)。

  • promise一共有三種狀態:pending,fullfilled,rejected。只有異步操作的結果可以決定pending最終的走向,結局只有一個,非fullfilled 即rejected,一旦狀態改變,再也不會更改, 正是promise的含義。
    resolved 并不是其中的一種狀態,resolved 代指兩種結局,fullfilled和rejected,但是習慣將成功的結果叫做resolved。
  • 缺點???
    promise 一旦開始立即執行無法取消
    如果不設置回調函數,會吃掉錯誤,不會拋出
    pending時無法知道進度以及走向
  • promise構造函數接受兩個參數,是兩個回調函數,成功的和失敗的。
    promise實例生成后,可以用then()方法分別指定resolved 和rejected的回調函數。then()函數可以面條式調用,注意,在promise 內部, 總是先執行同步任務,(此處應該和微任務隊列時間循環有關系,別處再議)
  • 優秀的做法:
    一般來說,調用resolve 或者reject之后promise的任務就完成 了,有別的邏輯應該寫在then()里面,而不應該寫在resolve或reject后面,所以最好在resolve或者reject前面加return。做完我該做的啥也不管了。
  • then方法返回的也是個promise,所以可以鏈式調用,前一個回調函數完成以后,會將結果作為參數傳入下一個then函數,then方法要等到前一個promise狀態發生變化才會被調用!
  • 箭頭函數在這用
  • promise.prototype.catch
    promise的錯誤拋出非常重要,如果沒有使用catch指定錯誤出來的回調函數,promise的對象拋出的錯誤不會傳遞到外層代碼,不會結束進程種植腳本的執行,即不會有任何反應。還會從錯誤地方繼續執行下去。
    promise.prototype.catch方法是.then(null,rejection)或.then(undefined,rejection)的別名,用于指定發生錯誤時的回調函數。
    具體寫法很重要去文章里找。
    promise的錯誤具有冒泡性質,會一直向后傳遞, 直到遇到catch語句被捕獲。
  • 優秀的做法:
    then()函數不寫rejected回調,直接調用catch方法捕獲錯誤。因為catch能捕獲到前面的錯誤,并且更像同步寫法。catch方法返回的還是一個promise,可以繼續.then()。
  • 科普:Node
    node 有一個unhandledRejection事件,專門監聽未捕獲的rejection錯誤,可以在監聽函數里面拋出錯誤,
process.on('unhandledRejection',function(err,promise){
throw err;
})

此函數接收兩個參數,一個錯誤對象, 另一個是報錯的promise對象,用來定位報錯環境,node計劃要廢除此事件。

  • promise.prototype.finally()
    finally方法用于指定不管promise對象最后狀態如何,都會執行的操作。(比如關閉服務器)該方法是ES2018引入標準的。
    他不接受任何參數。屬于then()的特例。
promise
.then(result=>{})
.catch(err=>{})
.finally(()=>{})
  • promise.all()(與門)
    用于將多個promise實例包裝成一個promise實例
const p  = Promise.all([p1,p2,p3]);

p的狀態取決于參數數組(可以不必是數組,有iterator接口就行,參數值不是promise 對象也可以,會先調用Promise.resolve進行轉換),全都fulfilled的情況下, p的狀態才會fulfilled,否則就是rejected。
p的返回值?
(1)fulfilled 情況下,參數組的返回值組成一個數組,傳遞給p的回調函數;
(2)rejected情況下,第一個被rejected的實例的返回值,會傳遞給p的回調函數。

  • Promise.race
    只要有一個實例的狀態發生改變,p的狀態就跟著改變。那個率先改變的Promise的返回值就傳遞給p的回調函數。
  • Promise.resolve()
    將現有對象轉換成promise 對象。
    !在本輪事件循環末尾執行,而不是下一輪事件循環開頭!
    可以轉換的分為三種情況:promise對象,thenable對象,沒有then方法或根本不是對象。
    此處的應用:如果象牙立即得到一個promise 對象,比較方便的方法就是直接調用promise.resolve方法。
  • Promise.reject()
    返回一個新的Promise實例,該實例的狀態為rejected
  • Promise.try()
    實際開發中,經常遇到一種情況:不知道或者不想區分函數是同步還是異步,就想用then制定下一步,用catch捕獲錯誤:
Promise.resolve().then(f)

因為promise.then().catch()的catch只能捕獲異步的錯誤,那么同步也會報錯怎么辦,事實上,Promise.try()就是模擬try catch代碼塊,將同步異步全都捕獲。

Promise.try(()=>{}.then().catch())
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容