Promise對象及它在js中的執行順序

  • 2019 年 11 月 13 日
  • 筆記

關於Promise對象的學習及它的執行順序

學習阮一峰老師的ES6入門後的記錄

1、promise的定義

promise是一個對象,通常包裹著一個非同步操作,promise對象提供一些介面的方法,返回一些操作的狀態或錯誤資訊
promise有三種狀態 pending(進行中)、resolved(已完成,也叫fulfilled)、rejected(已失敗)
注意:promise中的狀態只能由 pending -> resolved 和 pending -> rejected兩種,且狀態一旦確認不能轉變
promise的基本用法
    <script>          let promise = new Promise(function(resolve,reject){//resolve和reject是函數              console.log('promise創建');              resolve();          })          promise.then(function(){//相當於resolve()              // console.log(a);//error跳到.catch              console.log('promise的執行完成了');          })          .catch(function(){//相當於reject()              console.log('promise的執行失敗了');          })      </script>

2、promise的一些方法

.then(fn1,fn2)

.then()方法中的參數,fn1是resolved狀態的回調函數,fn2(可選)是rejected狀態的回調函數,一般只用fn1來作為promise成功的處理函數
注意:.then()返回的是一個新的promise實例,.then(fn1)fn1中的返回的數據作為新promise的參數

.catch(fn)

.then(null/undefined,function(){})的別名,是發生錯誤是的回調函數
注意:在promise執行順序中當.then()的成功處理函數執行,導致不會執行.catch()中的函數,反之一樣

.finally(function(){})

不論是執行.then()還是執行.catch(),finally都會執行

程式碼示例:
    <script>          let promise = new Promise(function(resolve,reject){              let i = 1;              resolve(i);//調用.then()中的方法              i++;              reject(i);//調用.catch()中的方法,不能與.then()一起執行          })          promise          .then(function(num){              console.log(num);          })          .catch(function(num){              console.log(num);          })          .finally(function(){//不論執行.then還是.catch,finally都會執行              console.log('finally');          })      </script>

3、promise中的執行順序

js執行是單執行緒的,所以瀏覽器執行會把js事件,劃分為當前執行,和等待執行的棧
等待執行中的棧一般為非同步事件,其中也分為宏任務和微任務之分,一般微任務在宏任務之前執行

promise對象.then,.catch為微任務

程式碼示例:
    <script>          setTimeout(function(){              console.log('setTimeout執行了');//宏任務          })          let promise = new Promise(function(resolve,reject){              console.log('promise執行了');//主進程              resolve();//or reject();          })          promise          .then(function(){              console.log('.then執行了');//微任務          })          .catch(function(){              console.log('.catch執行了');//微任務          })          .finally(function(){              console.log('finally執行了');//微任務          })      </script>

上面程式碼的執行順序是: