Promise的含義

木頭人1發表於2015-11-28

Promise的含義

所謂Promise,就是一個物件,用來傳遞非同步操作的訊息。

Promise物件有以下兩個特點:

  • 物件的狀態不受外界影響。Promise物件代表一個非同步操作,有三種狀態:Pending(進行中)、Resolved(已完成,又稱Fulfilled)和Rejected(已失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
  • 一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise物件的狀態改變,只有兩種可能:從Pending變為Resolved和從Pending變為Rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果。就算改變已經發生了,你再對Promise物件新增回撥函式,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

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

Promise也有一些缺點:

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

## 基本用法

Promise物件是一個建構函式,用來生成Promise例項

//建立promise
var promise = new Promise(function(resolve, reject) {
    // 進行一些非同步或耗時操作
    if ( /*如果成功 */ ) {
        resolve("Stuff worked!");
    } else {
        reject(Error("It broke"));
    }
});
//繫結處理程式
promise.then(function(result) {
    //promise成功的話會執行這裡
    document.write(result); // "Stuff worked!"
}, function(err) {
    //promise失敗會執行這裡
    document.write(err); // Error: "It broke"
});
  • resolve函式的作用是,將Promise物件的狀態從“未完成”變為“成功”(即從Pending變為Resolved),在非同步操作成功時呼叫,並將非同步操作的結果,作為引數傳遞出去;
  • reject函式的作用是,將Promise物件的狀態從“未完成”變為“失敗”(即從Pending變為Rejected),在非同步操作失敗時呼叫,並將非同步操作報出的錯誤,作為引數傳遞出去。

相關文章