Promise掃盲

then

then函數能夠return另外一個promise數組

const p1 = new Promise((resolve, reject) =>{
    resolve('p1')
})
const p2 = new Promise((resolve, reject) =>{
  setTimeout(() =>{
    resolve('p2')
  },3000)
})
p1.then(res => {
  console.log(res)
    return p2
}).then(res =>{  
    // p2 resolve後才執行
    console.log(res)
})
//p1
// 3s後輸出...
// p2
複製代碼

那麼這個p2就會代替當前p1的狀態,等到新的p2的狀態修改時,下一個then纔會執行promise

catch

1. 做用

能夠捕獲到promise程序執行中的error,等同於 .then(null, rejection).then(undefined, rejection)函數

2. 能夠獲取到的錯誤

  • promise函數體中拋出的errorpromise resolve後,再拋出錯誤,不會被捕獲
    const p1 = new Promise((resolve,reject) => {throw new Error('error')})
    p1.catch(error => console.log(error))   // Error: error
    複製代碼
  • promisereject操做
    const p2 = new Promise((resolve,reject) => reject('rejected'))
    p2.catch(error => console.log(error))  // rejected
    複製代碼
  • then 函數體中拋出的error
    const p3 = new Promise((resolve,reject) => resolve('resolved'))
    p3.then(res =>{
        throw new Error('error')
    }).catch(error => console.log(error))  // Error: error
    複製代碼
  • then函數能夠返回一個promise(若是沒有定義catch方法),若是這個promise函數體中有reject或者error,也能夠捕獲到

3. 推薦使用catch方式捕獲錯誤,而不是then的第二個參數:

由於catch能夠捕獲到它前面全部then方法中的錯誤ui

finally

  • 無論promise最後狀態如何,都會執行的操做
  • 沒有參數,獲取不到當前promise最後的狀態

Promise.all

1. 參數

  • 參數不單單能夠是數組,具備Iterator接口的對象均可以。
  • 數組參數的每個元素爲promise實例,若是不是,就會調用Promise.resolve轉換爲Promise實例
    const obj = {
       [Symbol.iterator]() {
           let index = 0
           return {
               next() {
                   return {
                       // promise對象 和 其餘類型均可以
                       value: new Promise(resolve => resolve(index++)), done: index > 2
                       // value: index++, done: index > 2
                   }
               }
           }
       }
    }
    const p = Promise.all(obj)
    p.then(res => {
       console.log(res)  // [0, 1]
    })  
    複製代碼

2. 狀態

const p = Promise.all([p1, p2, p3]);
複製代碼

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

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

3. catch

若是參數中的promise定義了catch方法,那麼Promise.all()catch就不會捕獲到錯誤code

Promise.race

  • 只要p一、p二、p3之中有一個實例率先改變狀態,p的狀態就跟着改變。那個率先改變的 Promise 實例的返回值,就傳遞給p的回調函數。
  • 參數、catch規則同Promise.all

Promise.resolve

將現有對象轉爲Promise對象。對象

1. 參數

  • 參數爲promise實例:原封不動的返回這個實例。
  • 參數爲thenable對象:將它轉爲promise對象,而後當即執行它的then方法
  • 參數不是thenable對象,或者是一個原始值:返回一個新的promise對象,狀態爲resolved
  • 沒有參數:直接返回衣蛾resolved狀態的promise對象

Promise.reject

返回一個狀態爲rejectedpromise實例接口

Promise.reject()方法的參數,會原封不動地做爲reject的理由,變成後續方法的參數回調函數

const thenable = {
  then(resolve, reject) {
    reject('error');
  }
};

Promise.reject(thenable)
.catch(e => {
  console.log(e === thenable)
})
// true e並非'error'
複製代碼
相關文章
相關標籤/搜索