- 首先,
Promise
并不是發源于javascript
,它最早被提出于E
語言中. - 那到底什么是
Promise
,它是抽象異步處理對象以及對其進行各種操作的組件,JS中Promise
的出現,很大程度上降低了異步編程的復雜性.
處理js中的異步,我用得最多的就是回調函數,那么Promise和回調函數在處理異步問題時的異同點是什么,又是如何使用的呢?帶著這些問題,我們一起來學習Promise
吧
Promise特點
- 在回調函數中,通常我們的第一個參數都是ERROR對象,但這只是一種慣例,并未規范化,即就是不這樣寫也不會出錯
- 但在
Promise
中 則是把類似的異步處理對象和處理規則進行規范化, 并按照采用統一的接口來編寫,而采取規定方法之外的寫法都會出錯,對應其處理結果Promise
都提供了統一的接口then()
,以及對應的異常處理接口catch()
.
基于 Promise
的統一接口的做法, 就可以形成基于接口的各種各樣的異步處理模式。所以,promise
的功能是可以將復雜的異步處理輕松地進行模式化.
Promise API
大致分為三種類型
-
Constructor
Promise
是一個構造函數,我們可以通過該構造函數來創建一個新的Promise
對象,具體是通過new方法來調用該構造函數
let p1 = new Promise(function(resolve,reject){
//異步處理
//調用resolve或者reject方法來處理異步結果
})
-
Instance Method
通過new Promise
得到的Promise
對象,需要設置在異步處理成功或者失敗時所要調用的回調函數,它有兩個方法,then()
和catch()
then()
:promise.then(onFulfilled, onRejected)
onFulfilled
和onRejected
分別是異步處理成功和失敗時所要調用的兩個函數,且都是可選的
若只處理成功時的結果:promise.then(onFulfilled)
若只處理失敗時的結果:promise.then(undefined, onRejected)
但后者還有一個更好的選擇,就是catch()
: promise.catch(onRejected)
-
Static Method
Promise
全局對象還有幾個靜態方法
Promise.all(iterable)
:返回所有成功的Promise對象或者某一個失敗的Promise對象
Promise.race(iterable)
:返回一個成功或者失敗的Promise對象,以先發生者為準
Promise.resolve(value)
:返回指定結果的Promise對象
Promise.reject(reason)
:返回一個Promise 對象,并且指定了失敗原因
function asyncFunction() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world');
}, 16);
});
}
asyncFunction().then(function (value) {
console.log(value); // => 'Async Hello world'
}).catch(function (error) {
console.log(error);
});
//上面的代碼中對異常處理用了catch(),當然也可以只用then()
asyncFunction().then(function (value) {
console.log(value); // => 'Async Hello world'
},function(err){
console.log(err);
});
Promise State
由new Promise()
得到的對象,有三種狀態,pending,resolve和reject
pending:既不是 resolve 也不是 reject 的狀態。也就是 promise 對象剛被創建后的初始化狀態等
resolve:成功狀態,此時會調用onFulfilled
reject:失敗狀態,此時會調用onRejected
三種狀態的轉換關系如下:
未完~