本文隻是針對對Promise有一定掌握的人士,列舉了Promise需要記住和掌握的關鍵點,不是講Promise的基礎知識。執行時機
Promise新建後會立即執行,同步的,但是resolved和rejected的回調函數是異步的, 但是它的回調是放在本輪循環的末尾執行,并不是放到下次事件循環中執行。
Promise三種狀态
pending (進行中)
fulfilled (已成功)
rejected (已失敗)
三種狀态隻能是由pending到fulfilled,或由rejected到rejected。狀态一旦改變,不會再變。 在狀體改變後再添加回調函數仍能立即得到結果,這是與事件的區别,事件結束再去監聽,是得不到結果的。
ResolveRejected
參數會傳遞給then回調函數
和rejected都不會終止後續代碼執行,resolved後面的代碼仍會執行,除非在resolved時return
當resolved的參數是一個promise實例時,會等待上一個promise的狀态返回
catch
參數傳遞給回調函數
參數通常是Error對象的實例
運行抛出異常,狀态也會變為Rejected
then
不僅狀态變為rejected時會觸發,運行中抛出的錯誤也會被catch捕獲
resolve之後抛出的異常,不會被捕獲,狀态隻會更改一次,更改後就不會改變。
“冒泡”性質,一直向後傳遞,直到被捕獲。也就是說錯誤肯定會被後面的catch捕獲。
如果不寫catch,promise有錯誤時,不會有任何反應,不會退出進程、終止腳本執行,promise和外部代碼“隔離”(未來可能更改這規則)
後面可以繼續跟then和catch
finally
返回的是一個新的promise對象,不是原來的
不推薦傳rejected回調函數,這樣無法捕獲resolved回調函數中的錯誤
如果函數中返回的是一個promise,則後面的then會等待這個promise的結果
finally方法用于指定不管 Promise 對象最後狀态如何,都會執行的操作。與狀态無關的,resolved或rejected了都會觸發finally(底層也是這麼實現的);但如果promise沒有返回resolved或rejected是不會執行的。
Promise.all()Promise.all方法用于将多個 Promise 實例,包裝成一個新的 Promise 實例。
自動把包裝的實例轉化成promise實例
包裝的promise實例都resolved了它就resolved
有一個rejected,它就rejected
如果容器中的實例有自己的catch,則不會觸發all的catch
因為catch返回是一個新的promise,catch已經處理了錯誤,返回的promise是resolved的,所以對all來說是兩個resolved的實例
Promise.race()和all類似,隻是它是有一個實例率先改變狀态了,它的狀态就改變了。Promise.resolve()把對象轉換成promise對象參數是一個 Promise 實例
原封不動地返回這個實例。參數是一個thenable對象
thenable對象指的是具有then方法的對象,比如下面這個對象。let thenable = { then: function(resolve, reject) { resolve(42); } };
resolve會立即執行then方法,然後返回一個resolved的promise對象
參數不是具有then方法的對象,或根本就不是對象
返回一個狀态是resolved的promise對象不帶有任何參數
直接返回一個resolved狀态的 Promise 對象。(注意promise回調的執行時機)Promise.reject()返回一個狀态為rejected的promise對象Promise.reject()方法的參數,會原封不動地作為reject的理由,變成後續方法的參數。這一點與Promise.resolve方法不一緻
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!