JavaScript Promise

Promise

1. 定義

const promise = new Promise(function(resolve, reject) {
  // ... 異步操做
  if (/* 異步操做成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

注意:Promise構造函數的參數是一個函數,而且該函數的二個參數也是函數。javascript

promise.then(
    function(value) {//resolved狀態的回調函數
    // success
    }
    , function(error) {//rejected狀態的回調函數
    // failure
    }
);

注意:Promise的實例用.then指定resolved和rejected狀態的回調函數。其中,第二rejected回調函數能夠爲空。
注意:.then指定的回調函數是異步回調函數,須要注意運行時機(同步代碼完成以後)和this指針指向(window)java

2. 缺陷

  • Promise對象一旦創建就會當即執行
  • 沒法取消Promise
  • 若是未指定rejected狀態的回調函數,內部錯誤沒法拋出到外部
  • Promise函數執行中時,沒法得知執行進度

3. 狀態

Promise對象的狀態有3種:es6

  • Pending
  • Fulfilled
  • Rejected
    只有在函數內部能夠更改狀態值,外部沒法改變。
    狀態改變後,沒法再次改變,從新添加回調函數將會當即獲得相同結果。
let pms = new Promise(
    function(rlv,rjt){
        rlv(1);
    }
);
pms.then(
    function(value){
        console.log(value)
    }
);//1
//再次添加
pms.then(
    function(value2){
        console.log(value2)
    }
);//1

Promise能夠嵌套Promise,以下:編程

const p1 = new Promise(function (resolve, reject) {
  // ...
});

const p2 = new Promise(function (resolve, reject) {
  // ...
  resolve(p1);
})

4. Promise.then的鏈式調用

Promise.then方法返回的是一個新的Promise實例,所以能夠像下面這樣調用json

getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

5. Promise.catch和finally

  • catch老是捕捉距離最近的promise返回
    所以要處理前一個Promise的錯誤應把catch放在then以前。
    由於then返回的也是一個promise,若是then內部出現錯誤,則catch捕捉到的就是then的錯誤。
  • finally(ES2018)無論promise最終是什麼狀態,都會執行

6. Promise.all 和 Promise.race

all:全部都變成fulfilled,則返回fulfilled。任意一個編程rejected,則返回rejected
race:任意一個率先編程fulfilled或rejected,則返回fulfilled或rejectedpromise

const pa = Promise.all([p1, p2, p3]);
const pr = Promise.race([p1, p2, p3]);

參考:http://es6.ruanyifeng.com/#docs/promise異步

相關文章
相關標籤/搜索