Promise是ES6裏新增的語法,一種異步編程的解決方案,比傳統的解決方案回調函數和事件更加合理和強大,Promise有三種狀態,分別是Pending(進行中),Fulfilled(已成功),Rejected(已失敗),狀態一旦發生變化就不能再發生改變,只能從一種狀態變為另一種,例如:Pending -> Fulfilled,Pending -> Rejected。Promise構造函數接收一個函數,這個函數有兩個固定的參數,分別是resolve和reject,這兩個參數也是一個函數,我們通過調用resolve函數會使狀態從Pending變為Fulfilled,將會執行then裏面的第一個回調函數參數,調用reject函數的話會使狀態從Pending變為Rejected,將會執行then裏面的第二個回調函數參數,假如then裏面只傳了一個參數的話,我們也可以通過catch來進行回調。

new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve("請求成功"); // 執行then裏面的第一個回調函數
        //reject("error message"); // 執行then裏面的第二個回調函數或執行catch裏面的回調函數
      }, 1000);
    }).then(res => {
      console.log(res)
    }, err => {
      console.log(err)
    }).catch(err=>{
      console.log(err)
    })

Promise.all可以將多個Promise實例包裝成一個新的Promise實例,這些Promise以數組的形式作為Promise.all的參數,要每個Promise都成功才會執行Promise.all的then的第一個參數函數回調,將這些Promise成功返回的結果以數組形式返回,只要有一個失敗都會進行reject操作,返回的結果為第一個失敗的Promise的結果。

Promise.all([
      new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve({
            name: 'why',
            age: 18
          })
        }, 2000);
      }),
      new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve({
            name: 'kobe',
            age: 19
          })
        }, 1000);
      })
    ]).then(results => {
      console.log(results);
    }).catch(err=>{
      console.log(err)
    })

Promise.race也是可以將多個Promise實例包裝成一個新的Promise實例,同樣的這些Promise以數組的形式作為Promise.race的參數,這些Promise實例哪個先發生狀態改變就先返回哪個的結果,無論是進行了resolve操作還是reject操作,相當於是賽跑。

Promise.race([
      new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve('請求成功')
        }, 1000);
      }),
      new Promise((resolve, reject) => {//第二個promise返回結果更快
        setTimeout(() => {
          resolve('請求失敗')
        }, 500);
      })
    ]).then(results => {
      console.log(results);
    }).catch(err => {
      console.log(err);//最終調用了catch
    })