1. 程式人生 > >ES6 學習 -- Promise對象

ES6 學習 -- Promise對象

異步 eject 控制 進展 兩種 操作 接口 優點 匿名

1.promise含義:可以將promise對象看成是一個容器,它保存著未來才會結束的某個事件(一般是異步操作事件)的結果,各
種異步操作都可以用promise對象來處理
promise的特點:
(1)promise對象有三個狀態:pending(進行中)、fulfilled(已成功)和rejected(已失敗),只有異步操作的結果,可
以決定當前是哪一種狀態,其他操作無法改變當前狀態
(2)一旦狀態值改變,就不會再變了,任何時候都可以得到這個結果。promise對象的狀態改變,只有從pending變為
fulfilled和從pending變為rejected兩種,狀態發生改變之後,就不會再變動

2.promise對象的優缺點:
優點--- 有了promise對象,就可以將異步操作以同步操作的流程表達出來,避免了多層嵌套的回調函數,另外promise對象提
供統一的接口,使得控制異步操作更加容易
缺點:無法取消promise,一旦新建就立即執行,無法取消;如果不設置回調函數,promise內部報錯不會反應到外部;當處於
pending狀態時,無法得知目前進展到哪個階段(是剛剛開始還是即將完成)

***解決Promise創建自動執行的辦法:將Promise對象在一個函數中定義,當我們調用函數時,才去執行Promise對象

3.promise對象實例用法
function getData() {

// 這裏請求後端數據

let p = new Promise(function(resolve, reject) {
  if(/* 異步操作成功 */) {
    resolve(value); // 請求得到的數據或響應結果
  }else {
    reject(error); // 請求失敗原因
  }
})
return p;
};

// 通過Promise構造函數創建實例,該構造函數接收一個匿名函數作為參數,匿名函數的兩個參數resolve和reject都
是兩個函數。resolve函數的作用是,將Promise對象的狀態從“未完成”變成“成功”,在異步操作成功時調用,並作為參數
傳遞出去;reject函數的作用是,將Promise對象的狀態從“未完成”變為“失敗”,在異步操作失敗時調用,並將異步操作報
的錯作為參數傳遞出去

getData().
then(function(result) {
  console.log(result);
})
.catch(function(error) {   // catch()可以在then()出錯的時候直接往下執行,不會直接報錯然後終止
  console.log(error);
})


Promise.prototype.finally() // 不管Promise對象最後狀態如何,該方法都會執行
如下:
promise
.then( result => {...}) // 狀態值為resolved時執行
.catch( error => {...}) // 狀態值為rejected時執行
.finally( ()=> {...}); // 不管如何都會執行

Promise.all() // 將多個Promise實例,包裝成一個新的Promise實例,如下:
const p = Promise.all([p1, p2, p3]);
(1)只有p1、p2、p3的狀態都變成fulfilled時,p的狀態才變成fulfilled,此時p1、p2、p3的返回值組成一個數組,傳遞給p的
回調函數
(2)只要p1、p2、p3中的一個狀態為rejected,那麽p的狀態就變成rejected,此時第一個狀態為rejected的實例的返回值,會
傳遞給p的回調函數

ES6 學習 -- Promise對象