ES6系列之promise

參考連接:
手寫一個本身的Promise(1)
https://www.jianshu.com/p/c63...
https://juejin.im/post/5b5c24...
一塊兒學習造輪子(一):從零開始寫一個符合Promises/A+規範的promise編程

定義

Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。json

特色

  1. 對象的狀態不受外界影響。Promise對象表明一個異步操做,有三種狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操做的結果,能夠決定當前是哪種狀態,任何其餘操做都沒法改變這個狀態。
  2. 一旦狀態改變,就不會再變,任什麼時候候均可以獲得這個結果。Promise對象的狀態改變,只有兩種可能:從pending變爲fulfilled和從pending變爲rejected。只要這兩種狀況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱爲 resolved(已定型)。若是改變已經發生了,你再對Promise對象添加回調函數,也會當即獲得這個結果。這與事件(Event)徹底不一樣,事件的特色是,若是你錯過了它,再去監聽,是得不到結果的。

Promise

Promise對象是一個構造函數,用來生成Promise實例。數組

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 異步操做成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

Promise實例生成之後,能夠用then方法分別指定resolved狀態和rejected狀態的回調函數。promise

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});
Promise 新建後就會當即執行。

調用resolve或reject並不會終結 Promise 的參數函數的執行。異步

new Promise((resolve, reject) => {
  resolve(1);
  console.log(2);
}).then(r => {
  console.log(r);
});
// 2
// 1

實例方法

then()

catch()

  • 若是對象狀態變爲resolved,則會調用then方法指定的回調函數
  • 若是異步操做拋出錯誤,狀態就會變爲rejected,就會調用catch方法指定的回調函數,處理這個錯誤
  • then方法指定的回調函數,若是運行中拋出錯誤,也會被catch方法捕獲
Promise 對象的錯誤具備「冒泡」性質,會一直向後傳遞,直到被捕獲爲止。也就是說,錯誤老是會被下一個catch語句捕獲。
getJSON('/post/1.json').then(function(post) {
  return getJSON(post.commentURL);
}).then(function(comments) {
  // some code
}).catch(function(error) {
  //

finally()

finally方法用於指定無論 Promise 對象最後狀態如何,都會執行的操做。異步編程

Promise方法

Promise.all()

Promise.all方法用於將多個 Promise 實例,包裝成一個新的 Promise 實例。函數

const p = Promise.all([p1, p2, p3]);

p的狀態由p一、p二、p3決定,分紅兩種狀況。oop

  1. 只有p一、p二、p3的狀態都變成fulfilled,p的狀態纔會變成fulfilled,此時p一、p二、p3的返回值組成一個數組,傳遞給p的回調函數。
  2. 只要p一、p二、p3之中有一個被rejected,p的狀態就變成rejected,此時第一個被reject的實例的返回值,會傳遞給p的回調函數。

Promise.race()

Promise.race方法一樣是將多個 Promise 實例,包裝成一個新的 Promise 實例。post

const p = Promise.race([p1, p2, p3]);

上面代碼中,只要p一、p二、p3之中有一個實例率先改變狀態,p的狀態就跟着改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數。學習

Promise.resolve()

有時須要將現有對象轉爲 Promise 對象,Promise.resolve方法就起到這個做用。

Promise.resolve等價於下面的寫法。

Promise.resolve('foo')
// 等價於
new Promise(resolve => resolve('foo'))
當即resolve的 Promise 對象,是在本輪「事件循環」(event loop)的結束時,而不是在下一輪「事件循環」的開始時。
setTimeout(function () {
  console.log('three');
}, 0);

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three

Promise.reject()

Promise.reject(reason)方法也會返回一個新的 Promise 實例,該實例的狀態爲rejected。

相關文章
相關標籤/搜索