promise的含義
promise是非同步程式設計的一種解決方法。
所謂promise,簡單說是乙個容器,裡面儲存著某個未來才會結束的事件(通常是乙個非同步操作)的結果,從語法上說,promise是乙個物件,從它可以獲取非同步操作的訊息,promise提供了統一的api,各種非同步操作都可以用同樣的方法進行處理。
promise物件的特點
(1)物件的狀態不受外界影響,promise物件代表乙個非同步操作,有三種狀態,pending(進行中)、fulfilled(已成功)、rejected(已失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態,這也是promise這個名字的由來「承若」;
(2)一旦狀態改變就不會再變,任何時候都可以得到這個結果,promise物件的狀態改變,只有兩種可能:從pending變為fulfilled,從pending變為rejected。這時就稱為resolved(已定型)。如果改變已經發生了,你再對promise物件新增**函式,也會立即得到這個結果,這與事件(event)完全不同,事件的特點是:如果你錯過了它,再去監聽是得不到結果的。
有了promise物件,就可以將非同步操作以同步操作的流程表達出來,避免了層層巢狀的**函式。此外,promise物件提供統一的介面,使得控制非同步操作更加容易。
promise也有一些缺點。首先,無法取消promise,一旦新建它就會立即執行,無法中途取消。其次,如果不設定**函式,promise內部丟擲的錯誤,不會反應到外部。第三,當處於pending狀態時,無法得知目前進展到哪乙個階段(剛剛開始還是即將完成)。
是乙個建構函式,這個建構函式裡有兩個引數,分別是:resolve(成功之後的**函式)、reject(失敗之後的**函式)。
因為promise表示的是乙個非同步操作,每當我們new乙個promise例項,就表示乙個具體的非同步操作,那麼這個非同步操作的結果就只能有兩種狀態:成功/失敗,兩者都需要**函式resolve/reject返回。所以內部拿到操作的結果後,無法使用return把操作結果返回給呼叫者,這時候只能用**函式的形式來把成功或失敗的結果返回給呼叫者。
1var promise = new promise (function
(resolve,reject) else
7 }) ;
promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的**函式
1promise.then(
2function
(value),
5function
(error)
8 )
then方法可以接受連個**函式作為引數,第乙個**函式是promise物件的狀態變為resolved時呼叫,第二個**函式是promise物件的狀態變為rejected時呼叫,其中,第二個函式是可選的,不一定要提供,這兩個函式都接受promise物件傳出的值作為引數;
*通過。then指定**函式的時候,成功的**函式必須傳,失敗的**函式可以省略。
如果前面的promise執行失敗,不詳影響後續操作終止,捕獲異常的兩種方式:
①可以為每個promise指定失敗**;
function(err))
②最後加catch(function(err))//表示如前面有任意乙個有報錯,立即報錯,並終止後面的;如果前面無報錯,前面正常執行。
1var getson = function
(url)
7if(this.status == 200) else
12};
13 xhr.responsetype - "json";
15xhr . send();
16});
17return
pronise;
18};
19 get5on (posts.json").then(function(json), function(error) );
getjson是對xmlhttprequest物件的封裝,用於發出乙個針對json資料的http請求,並且返回乙個promise物件,需要注意的是,在getjson內部,resolve函式和reject函式呼叫時,都帶有引數;
如果呼叫resolve函式和reject函式時帶有引數,那麼他們的引數會被傳遞給**函式,reject函式的引數通常是error物件的例項,表示丟擲的錯誤,resolve函式的引數除了正常的值以外,還可以是另乙個promise例項;
async 函式的返回值為promise物件,promise物件的結果由async函式執行的返回值決定
await右側的表示式一般為promise物件, 但也可以是其它的值,如果表示式是promise物件, await返回的是promise成功的值,如果表示式是其它值, 直接將此值作為await的返回值
注意:await必須寫在async函式中, 但async函式中可以沒有await,如果await的promise失敗了, 就會丟擲異常, 需要通過try...catch來捕獲處理
色度抽樣(4 2 0)到底怎麼理解?
之前看了好多資料,國內的國外的。對於色度抽樣4 2 0介紹的都差不多,老感覺還有哪些細節問題沒有介紹清楚,通過不斷的摸索翻閱資料算是徹底弄清楚了,相信我能以很簡短的方式告訴同樣被該問題困惑的你。如 我們打算採取如圖1所示的16個畫素點資訊 每個數字代表乙個畫素點 如果以rgb24方式儲存,我們知道每...
Cookie與Session到底怎麼理解
突然感覺對這個熟悉又陌生的東西不是很理解,於是查了半天資料,發現都是定義說一通,用法場景說一通,都沒有說明白,他倆是怎麼一回事。還得自己想辦法。我就不說定義一類的了,多餘。1 首先要對他們的結構有所認識,cookie 可以看到是以分號隔開的key value形式的資料 由此得知,客戶端cookie是...
深入理解Promise
最近把promise重新學了一下,對promise有了更深層次的理解,話不多說,可以看下 自定義promise函式模組 function window onrejected 0 function resolve value catch error 向後傳遞失敗的reason const self t...