一、介紹
1.含義
Promise是異步變成解決方案,比傳統異步方案(回調和事件)更合理更強大。簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是異步操作)結果。從他可以獲取異步操作的消息,Promise提供統一的API,各種異步操作都可以用同樣的方法進行處理。
2.兩個特點 :
Promise 內部的錯誤不會影響到 Promise 外部的代碼,通俗的說法就是“Promise 會吃掉錯誤”。
? ? 1> 對象的狀態不受外界的影響,Promise對象代表一個異步操作,
? ? ? ? ?有三種狀態 : pending(進行中),fullfaild ( 已成功 ) ,rejected(失敗);
? ? ? ? ?只有異步操作的結果,可以決定是哪種狀態,不可中途改變。
? ? 2> 一旦狀態改變,就不會再變,任何時候都可以得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是? ?得不到結果的。
有了Promise對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise對象提供統一的接口,使得控制異步操作更加容易。
3 .缺點
? ? 1>無法取消,一旦新建一個Promise就會立即執行
? ? 2>如果不設置回調函數,Promise內部拋出的錯誤,不會反應到外部
? ? 3>當處于pending狀態時,無法得知現在處于哪個狀態,是剛剛開始還是已經結束。
二、用法
1、Promise對象是一個構造函數,用來生成Promise實例。
resolve函數的作用是:將Promise對象的狀態從“未完成”變為“成功”(即從 pending 變為 resolved),在異步操作成功時調用,并將異步操作的結果,作為參數傳遞出去;
reject函數的作用是:將Promise對象的狀態從“未完成”變為“失敗”(即從 pending 變為 rejected),在異步操作失敗時調用,并將異步操作報出的錯誤,作為參數傳遞出去。
2.Promise實例生成后,then方法分別指定resolved和rejecte的回調函數:
Promise實例生成以后,可以用then方法分別指定resolved狀態和rejected狀態的回調函數。
then方法可以接受兩個回調函數作為參數:Promise異步執行之后調用then()
????第一個回調函數是Promise對象的狀態變為resolved時調用,
????第二個回調函數是Promise對象的狀態變為rejected時調用。
其中,第二個函數是可選的,不一定要提供。這兩個函數都接受Promise對象傳出的值作為參數。
Promise實例的狀態變為resolved,就會觸發then方法綁定的回調函數。Promise 新建后就會立即執行。
注意,調用resolve或reject并不會終結 Promise 的參數函數的執行。
2.Promise實例生成后,then方法分別指定resolved和rejecte的回調函數。
? ??then方法返回的是一個新的Promise實例(注意,不是原來那個Promise實例)。因此可以采用鏈式寫法,即then方法后面再調用另一個then方法。
3.Catch()
4.Promise,all()
Promise.all方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例。只要有一個錯誤,就會停止。
以下示范全部成功的情況 :?
5.Promise.resolve()
有時需要將現有對象轉為Promise對象,Promise.resolve方法就起到這個作用。
(1)參數是一個Promise實例
如果參數是Promise實例,那么Promise.resolve將不做任何修改、原封不動地返回這個實例。
(2)參數是一個thenable對象
thenable對象指的是具有then方法的對象,比如下面這個對象。
? ??????(3)參數不是具有then方法的對象,或根本就不是對象:
? ??????????????如果參數是一個原始值,或者是一個不具有then方法的對象,則Promise.resolve方法返回一個新的Promise對象,狀態為resolved。
? ? (4)不帶有任何參數
? ????????????Promise.resolve方法允許調用時不帶參數,直接返回一個resolved狀態的Promise對象。
? ? ? ? ? ? ? 如果希望得到一個Promise對象,比較方便的方法就是直接調用Promise.resolve方法。
三、應用
1、加載圖片
我們可以將圖片的加載寫成一個Promise,一旦加載完成,Promise的狀態就發生變化。