# ES6 Promise # 概述 Promise物件是為了避免多重異步操作導致Callback hell發生而提出的解決方案。 # 如何使用 我們先建立第一個Promise物件: ``` var promise = new Promise(function(resolve, reject) { // ... if (異步操作成功) { resolve(value); } else { reject(error); } }); ``` Promise 構造函數 (constructor) 接受一個函數作為參數,這個函數會在建立 Promise 物件的同時立刻被執行,該函數有兩個參數分別是 resolve 函數和 reject 函數。 resolve(value) 函數的用途是用來將 Promise 物件的狀態變為 fulfilled (已完成),在非同步操作成功時調用,你可以將非同步操作的結果當作參數一起傳入 reject(error) 函數的用途是用來將 Promise 物件的狀態變為 rejected (已失敗),在非同步操作失敗時調用,你可以將非同步操作的錯誤當作參數一起傳入 ![](https://i.imgur.com/RUNShkT.png) **Promise.prototype.then(onFulfilled, onRejected)** Promise 物件生成後,可以用 then() 方法來綁定當 fulfilled 或 rejected 狀態時,分別要執行的函數。 ``` promise.then(function(value) { // 當狀態是 fulfilled (成功) 時,執行這個函數 // value 是透過 resolve() 傳進來的參數 }, function(error) { // 當狀態是 rejected (失敗) 時,執行這個函數 // error 是透過 reject() 傳進來的參數 }); ``` then() 方法接受兩個函數作為參數: 第一個函數是當 Promise 狀態變為成功(fulfilled)時會被調用(畫線處1) 第二個函數是當 Promise 狀態變為失敗(rejected)時會被調用,這個參數是選擇性的不一定需要(畫線處2) ![](https://i.imgur.com/Uui9B4n.png) **Promise.prototype.catch(onRejected)** Promise 物件生成後,可以用 catch() 方法來綁定當 rejected 狀態時,要執行的函數。 catch() 的用途就像是 then(undefined, onRejected)。(畫線處3) ![](https://i.imgur.com/txz6vSi.png) **Chaining 串接** then() 和 catch() 方法執行後都會返回一個新的 Promise 物件,讓你可以使用 chaining 的語法。 而後面的 then() 會接收前一個 then() 的 return value 當作參數。 ``` let f = fetch("https://jsonplaceholder.typicode.com/users"); f.then(function(userData) { return userData.json() }) .then(function(jsonData) { console.log(jsonData) return jsonData }) .then(function(jsonData) { console.log(jsonData.length) }) ```