Promise對象是ES6( ECMAScript 2015 )對於異步編程提供的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。
詳細解答:
傳統回調:
// 當參數a大於10且參數func2是一個方法時 執行func2 function func1(a, func2) { if (a > 10 && typeof func2 == 'function') { func2() } } func1(11, function() { console.log('this is a callback') })
Promise對象改寫:
function func1(a){ return new Promise((resolve,reject) => { if(a > 10){ resolve(a) }else{ reject(b) } }) }; func1('11').then(res => { console.log('success'); }).catch(err => { console.log('error'); })
Promise對象的兩個特點:
1、對象的狀態不受外界影響。
Promise對象有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。
只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
這也是Promise這個名字的由來,它的英語意思就是“承諾”
,表示其他手段無法改變。
2、一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
Promise對象的狀態改變,只有兩種可能:
從pending變為fulfilled和從pending變為rejected。
只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。
如果改變已經發生了,你再對Promise對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。
Promise對象實例的兩個參數,resolve 和 reject:
Promise構造函數接受一個函數作為參數,該函數的兩個參數分別resolve
和 reject
。它們是兩個函數,由 JavaScript 引擎提供,不用自己部署。
resolve函數的作用是: 將Promise對象的狀態從“未完成”變為“成功”(即從 pending 變為 fulfilled),在異步操作成功時調用,並將異步操作的結果,作為參數傳遞出去;
reject函數的作用是: 將Promise對象的狀態從“未完成”變為“失敗”(即從 pending 變為 rejected),在異步操作失敗時調用,並將異步操作報出的錯誤,作為參數傳遞出去。
Promise對象實例的方法,then 和 catch:
.then方法: 用於指定調用成功時的回調函數。
then方法返回的是一個新的Promise實例(注意,不是原來那個Promise實例),因此可以采用鏈式寫法,即then方法后面再調用另一個then方法。
.catch方法: 用於指定發生錯誤時的回調函數。