JavaScript Promise 物件

admin發表於2019-04-24

一、什麼是Promise

        ECMAscript 6 提供了 Promise 物件。Promise 是非同步程式設計的一個解決方案,不同於回撥,裡面儲存著某個未來才會結束的事件(通常是一個非同步操作(定時器,ajax,圖片載入))的結果。所謂Promise,就是一個容器,裝的就是非同步的操作(未來才會產生的事情)。Promise 是一個物件,從它可以獲取非同步操作的訊息。

二、Promise的特點

        1.物件的狀態不受外界影響。Promise物件代表一個非同步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。任何其他操作都無法改變這個狀態。(某些時候用resolved(已完成)來代替fulfiller(已成功)的狀態)

        2.一旦狀態改變,就不會再變。Promise物件的狀態改變只有兩種可能:從pending-->resolved和從pending-->rejected。

三、基本寫法

        下面用一個小例子向大家展示promise的基本寫法:

13737584-5a5e374ffcf4a6c0.png
promise基本寫法
13737584-82e649a48626968d.png
列印結果

可以看到列印出來的是成功。當const a=false時,列印結果為失敗。

        Promise建構函式兩個引數分別是resolve和reject。resolve是非同步操作成功時需要執行的 reject是非同步操作失敗時需要執行的。

四、用Promise物件實現的 Ajax 操作

         下面寫一個簡單的例子:

13737584-197794e786741e92.png
簡單寫3個txt檔案,作為ajax訪問的路徑


13737584-1a703e0a128b8422.png
這是三個Promise物件,裡面裝的是ajax操作(用的是jquery的)


13737584-bc6391007dea861a.png
執行then操作。分別用來all和race


13737584-0250c52f92e84ab2.png
列印結果

可以看出。all是所有非同步操作全部執行完畢,才執行的then。而race則是隻接收最快的非同步資料。

五、promise中的then

        Promise例項生成以後就具有then方法了,因為then方法是定義在原型物件Promise.prototype上的。promise.then() 是 promise 最為常用的方法,可以用then方法分別指定resolved狀態和rejected狀態的回撥函式。其中rejected狀態的回撥函式是可選的。 解決ajax1的返回的資料在ajax2裡面使用,每個ajax放到一個Promise物件裡面。p1.then放到p2的Promise物件裡面執行。then 可以一直往下走,可以有多個。而catch是錯誤執行的程式碼,只能有一個,並且放在所有then之後執行。

六、Promise 優缺點

      有了 Promise 物件,就可以將非同步操作以同步操作的流程表達出來,避免了層層巢狀的回撥函式。此外,Promise 物件提供統一的介面,使得控制非同步操作更加容易。

      Promise 也有一些缺點。首先,無法取消 Promise,一旦新建它就會立即執行,中途不能取消。其次,如果不設定回撥函式,Promise 內部丟擲的錯誤,不會反應到外部。第三,當處於 Pending 狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。



            總結的可能有點亂不是很完整。有好的意見可以交流噢~

相關文章