ES6學習筆記--Promise


什麼是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("出錯了") )                    複製代碼
相關文章
相關標籤/搜索