1. 程式人生 > >Promise學習筆記。

Promise學習筆記。

1.Promise的含義

Promise是非同步程式設計的一種解決方案,比傳統的解決方案--回撥函式和事件更合理更強大。所謂Promise,簡單說就是一個容器,裡面儲存著某個未來才會結束的事件(通常是一個非同步操作)的結果。
Promise物件有以下兩個特點:
(1)物件的狀態不受外界影響。Promise物件代表一個非同步操作,有三種狀態:pending(進行中)、fulfiled(已成功)和rejected(已失敗)。只有非同步操作的結果,可以決定當前是哪一種狀態,任何其它操作都無法改變這個狀態。
(2)一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise物件的狀態改變,只有兩種可能:從pending變為fulfiled和從pending變為rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為resolved(已定型)。

缺點:
首先,無法取消Promise,一旦新建他就會立即執行,無法中途取消。其次,如果不設定回撥函式,Promise內部丟擲的錯誤,不會反應到外部。第三,當處與pending狀態時,無法得知目前進展到哪一個階段。

下面的程式碼創造了一個Promise例項。

const promise = new Promise(function(resolve,reject){
    if(/*非同步操作成功*/){
        resolve(value);
    }else{
        reject(error);
    }
});

Promise建構函式接受一個函式作為引數,該函式的兩個引數分別是resolve和reject。它們是兩個函式,由JavaScript引擎提供,不用自己部署。
resolve函式的作用是,將Promise物件的狀態從未完成變為成功,在非同步操作時呼叫,並將非同步操作的結果,作為引數傳遞出去;reject函式的作用是,將Promise物件的狀態從未完成變為失敗,在非同步操作失敗時呼叫,並將非同步操作報出的錯誤,作為引數傳遞出去。
Promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的回撥函式。

promise.then(function(value){
    //success
},function(error){
    //failure
})

then方法可以接受兩個回撥函式作為引數。第一個回撥函式是Promsie物件的狀態變為resolved時呼叫,第二個回撥函式是Promise物件的狀態變為rejected時呼叫。其中,第二個函式是可選的,不一定要提供。這兩個函式都接受Promise物件傳出的值作為引數。
下面是一個Promise物件的簡單例子:

function timeout(ms){
    return new Promise((resolve,reject)=>{
        setTimeout(resolve,ms,'done');
    })
}
timeout(100).then((value)=>{
    console.log(value);
})

上面程式碼中,timeout方法返回一個Promise例項,表示一段時間後才會發生的結果。過了指定時間以後,promise實力的狀態變為resolved,就會觸發then方法繫結的回撥函式。