在我們平時的方法中有很多方法是promise封裝的,
有些函數后邊跟的then和catch 就是promise的方法,先看一下pormise的特點
?
(1)對象的狀態不受外界影響。Promise
對象代表一個異步操作,有三種狀態:pending
(進行中)、fulfilled
(已成功)和rejected
(已失敗)。
只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
這也是Promise
這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。
?
?上邊這句話摘自阮一峰老師的博客? ??但是講是講出來了,總感覺有些朦朧,深挖一下,上圖看看這個promise里邊到底都有什么
?
?
需要注意的是Promise 的首字母要大寫 因為是構造函數 不然會報錯 ,之前犯過這樣的錯誤,找了好久,提醒一下
?
?
?
?promise的三種狀態
?
?PromiseValue 用法
?
?
上邊說了catch和then,一個接收成功一個接收失敗,promise里邊還有一個finally方法,他是不管成功還是失敗只要promise執行完畢這個函數都會被執行
?
?
?
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
Promise
對象的狀態改變,只有兩種可能:從pending
變為fulfilled
和從pending
變為rejected
。
只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。
如果改變已經發生了,你再對Promise
對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
?
那么講了這么一大堆? 這個promise他到底有什么用處呢,就是為了解決回調地獄,之前在網上看到過這么一個圖片
?
這代碼看起來是不是很酸爽,回調一層套一層,多了的話感覺就是一個大型的沖擊波,沖擊著js開發者的心靈
?
舉個例子
?
?
but到這里貌似和回調沒有什么毛區別? ,他的優勢體現在哪里,so 看圖
?
?
打印了一下then方法? ?發現里邊還是一個promise,所以說return的結果可以繼續被.then,且結果可以繼續被調用
如果用回調的話就會造成回調地獄現象
promise的話大大的降低了維護成本和讓代碼看起來更優雅
?
promise除了原型鏈上的方法之外還有一些他本身的方法,如下圖
?
?
promise.all()
這個方法允許傳入一個數組 他會執行里邊所有的promise實例? 如果傳入的不是promise也會被轉換成promise
并且只有在傳入的所有的參數都返回resovled的時候all()方法才會是resolve,其中有一個參數是rejected的話
all()方法狀態就是變成rejected
?
promise.race()
這個方法相對于上邊的all()而言,它更像是比賽跑,他會返回第一個執行完畢的promise實例的狀態
?
promise.resolve()
這個方法會把一個對象創建成一個promise對象并return出resolve狀態出來
如果傳進去的是一個promise對象的話? 那么就會被直接return出來并執行resolve
?
?
promise.reject()
同理
該方法也會返回一個新的 Promise 實例,該實例的狀態為rejected并執行reject
?
?
如有不足之處請大家批評指正
?