promise到底怎麼理解

2022-09-14 14:12:13 字數 2531 閱讀 7195

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把操作結果返回給呼叫者,這時候只能用**函式的形式來把成功或失敗的結果返回給呼叫者。

1

var promise = new promise (function

(resolve,reject) else

7 }) ;

promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的**函式

1

promise.then(

2function

(value),

5function

(error)

8 )

then方法可以接受連個**函式作為引數,第乙個**函式是promise物件的狀態變為resolved時呼叫,第二個**函式是promise物件的狀態變為rejected時呼叫,其中,第二個函式是可選的,不一定要提供,這兩個函式都接受promise物件傳出的值作為引數;

*通過。then指定**函式的時候,成功的**函式必須傳,失敗的**函式可以省略。

如果前面的promise執行失敗,不詳影響後續操作終止,捕獲異常的兩種方式:

①可以為每個promise指定失敗**;

function(err))

②最後加catch(function(err))//表示如前面有任意乙個有報錯,立即報錯,並終止後面的;如果前面無報錯,前面正常執行。

1

var 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...