什麼是Promise:Promise是JS異步編程的一種解決方案,比傳統的解決方案【回調函數】【事件】更合理更強大。傳統的解決方案有個問題就是回調地獄,Promise能夠讓咱們經過l鏈式調用的方法解決回調地獄的問題。
Promise的狀態:
- Pending(進行中):起始狀態
- Fulfilled(已成功):resolve函數將promise對象從Pending從pending變成 Fulfilled
- Rejected(已失敗):reject函數將promise對象從Pending從pending變成 Failed
只可能從pending->Fulfilled 或者 Pending -> Rejected。只要這兩種情發生,狀態就凝固了,不會再改變
基本用法
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 異步操做成功 */){
resolve(value);
} else {
reject(error);
}//resolve和reject的參數將會傳給回調函數then和catch中
});複製代碼
Promise實例生成之後,能夠用then方法分別指定resolved狀態和rejected狀態的回調函數
promise.then(function(value) { // then有兩個參數,第一個參數是resovled時的狀態回調
// success
}, function(error) { //第二個參數是可選的,爲rejected時的狀態回調函數
// failure
});
複製代碼
Promise 新建後就會當即執行。
let promise = new Promise(function(resolve, reject) {
console.log('Promise');
resolve();
});
promise.then(function() {
console.log('resolved.');
});
console.log('Hi!');
// Promise
// Hi!
// resolved
複製代碼
注意,調用resolve或reject並不會終結 Promise 的參數函數的執行。
new Promise((resolve, reject) => {
resolve(1);
console.log(2);
}).then(r => {
console.log(r);
});
// 2
// 1
const p1 = new Promise(function (resolve, reject) {
// ...
});
const p2 = new Promise(function (resolve, reject) {
// ...
resolve(p1);
})複製代碼
上面代碼中,p1和p2都是 Promise 的實例,可是p2的resolve方法將p1做爲參數,即一個異步操做的結果是返回另外一個異步操做。
注意,這時p1的狀態就會傳遞給p2,也就是說,p1的狀態決定了p2的狀態。
Promise.Prototype.then:
Prommise狀態改變時的回調函數,共有兩個參數。第一個參數是Resolve時的回調函數,第二個參數是Rejected時的回調函數(可選參數)
能夠使用then方法來進行鏈式的調用,then的每一次結果都返還給下一個then方法,而後在下一個then方法中對這個值進行處理。每個then方法中均可以再次新建立一個Promise對象,而後返還給下一個then方法處理。
p1.then(() => {
return 1;
}).then((result) => {
console.log(result);
return 'hello'
}).then((result) => {
console.log(result);
});
Promise.Prototype.catch()複製代碼
p.then(null,rejection)的別名,用於指定發送錯誤時的回調函數
Promise對象的錯誤具備冒泡性值,會一直向後傳遞,直到被捕獲爲止。
Promise.all()
用於將多個Promise實例包裝成一個新的Promise實例
var p=Promise.all([p1,p2,p3])複製代碼
- 接受一個數組做爲參數,數組成員都是promise對象的實例,若是不是則經過Promise.resolve方法把參數轉爲Promise實例
- p的狀態由p1,p2,p3決定。p1,p2,p3都爲fulfilled p的狀態纔會變成fulfilled。若其中一個爲rejected,則p的狀態rejected。
- p1,p2,p3的返回值會組成一個數組,傳遞給p的回調函數。
- 若p1,p2,p3自身有catch方法,那麼他們rejected時不會觸發Promise.all()的catch方法
Promise.race()
var p=Promise.race([p1,p2,p3])複製代碼
也是將多個Promise實例包裝成要給新的Promise實例,只要p1,p2,p3中有一個實例率先改變狀態,p的狀態就跟着改變。
Promise.resolve()
將現有對象轉成Promise對象,狀態爲resolved
Promise.resolve('foo')
//等價於
new Promise(resolve=>resolve('foo'))複製代碼
Promise.reject()
返回一個新的Promise實例,狀態爲Rejected
var p=Promise.rejected("出錯了")
//等價於
var p=new Promise( (resolve,reject) => reject("出錯了") ) 複製代碼