本文只是針對對
Promise
有必定掌握的人士,列舉了Promise須要記住和掌握的關鍵點,不是講Promise的基礎知識。若是是學習Promise,請移步
阮一峯老師的博客。
Promise新建後會當即執行,同步的,可是resolved和rejected的回調函數是異步的, 可是它的回調是放在本輪循環的末尾執行,並非放到下次事件循環中執行。
- pending (進行中)
- fulfilled (已成功)
- rejected (已失敗)
三種狀態只能是由pending到fulfilled,或由pending到rejected。狀態一旦改變,不會再變。 在狀態改變後再添加回調函數仍能當即獲得結果,這是與事件的區別,事件結束再去監聽,是得不到結果的。
- 參數會傳遞給then回調函數
- 和rejected都不會終止後續代碼執行,resolved後面的代碼仍會執行,除非在resolved時return
- 當resolved的參數是一個promise實例時,會等待上一個promise的狀態返回
- 參數傳遞給回調函數
- 參數一般是Error對象的實例
- 運行拋出異常,狀態也會變爲Rejected
- 不只狀態變爲rejected時會觸發,運行中拋出的錯誤也會被catch捕獲
- resolve以後拋出的異常,不會被捕獲,狀態只會更改一次,更改後就不會改變。
- 「冒泡」性質,一直向後傳遞,直到被捕獲。也就是說錯誤確定會被後面的catch捕獲。
- 若是不寫catch,promise有錯誤時,不會有任何反應,不會退出進程、終止腳本執行,promise和外部代碼「隔離」(將來可能更改這規則)
- 後面能夠繼續跟then和catch
- 返回一個resolved狀態的promise對象,因此若是拋出一個錯誤,只會觸發第一個catch
- 返回的是一個新的promise對象,不是原來的
- 不推薦傳rejected回調函數,這樣沒法捕獲resolved回調函數中的錯誤
- 若是函數中返回的是一個promise,則後面的then會等待這個promise的結果
finally方法用於指定無論 Promise 對象最後狀態如何,都會執行的操做。
與狀態無關的,resolved或rejected了都會觸發finally(底層也是這麼實現的); 但若是promise沒有返回resolved或rejected是不會執行的。
Promise.all方法用於將多個 Promise 實例,包裝成一個新的 Promise 實例。es6
- 自動把包裝的實例轉化成promise實例
- 包裝的promise實例都resolved了它就resolved
- 有一個rejected,它就rejected
- 若是容器中的實例有本身的catch,則不會觸發all的catch
由於catch返回是一個新的promise,catch已經處理了錯誤,返回的promise是resolved的,因此對all來講是兩個resolved的實例
和all相似,只是它是有一個實例率先改變狀態了,它的狀態就改變了。
把對象轉換成promise對象
參數是一個 Promise 實例 promise
原封不動地返回這個實例。
參數是一個thenable對象異步
thenable對象指的是具備then方法的對象,好比下面這個對象。
let thenable = { then: function(resolve, reject) { resolve(42); } };
resolve會當即執行then方法,而後返回一個resolved的promise對象函數
參數不是具備then方法的對象,或根本就不是對象學習
返回一個狀態是resolved的promise對象
不帶有任何參數code
直接返回一個resolved狀態的 Promise 對象。(注意promise回調的執行時機)
返回一個狀態爲rejected的promise對象
Promise.reject()方法的參數,會原封不動地做爲reject的理由,變成後續方法的參數。這一點與Promise.resolve方法不一致
這個有須要一些技術儲備,後續補充。對象