###### tags: `slide` ## ES6 進入天堂的窄門 # Promise --- # Why Promise? --- ## Promise 結構是一種非同步執行的控制流程架構 --- #### 在ES6被提出 ## 這種結構解決了 ES5 以前 callback hell ![](https://i.imgur.com/iUVDy6x.jpg) --- ```javascript // Callback hell async1(function(){ async2(function(){ async3(function(){ .... }); }); }); // Promise var task1 = async1(); var task2 = task1.then(async2); var task3 = task2.then(async3); ``` --- ## How? 流程 --- <div style="text-align: left;"><font size = "5">結果會進入 <font color = "lighblue">fulfill(實現)</font> 或 <font color = "red">reject(拒絕)</font>狀態,Promise 中會使用 <font color = "lighblue">resolve(成功)</font> 或 <font color = "red">reject(失敗)</font> 回傳結果,並在調用時使用 <font size = "7" color = "lighblue">then</font> 或 <font size = "7" color = "red">catch</font> 取得值。</font></div> <font size = "5" color = "yellow">特別注意這兩個僅能回傳其中之一,回傳後表示此 Promise 事件結束。</font> ![](https://i.imgur.com/v9yAHC8.png) --- ## 透過 new 及其建構式建立一個Promise物件 --- ```javascript const myFirstPromise = new Promise((resolve, reject) => { // resolve(someValue); // 實現 // 或 // reject("failure reason"); // 拒絕 }); myFirstPromise .then(function(success){ // if object's state is fulfilled, go here }, function(fail){ //選填 // if object's state is rejected, go here }) .catch(function(fail){ // if object's state is rejected, go here }) ``` --- ## Promise 會有三個狀態: ##### 擱置(pending):初始狀態,不是 fulfilled 與 rejected。 ##### 實現(fulfilled):表示操作成功地完成。 ##### 拒絕(rejected):表示操作失敗了 --- # What is ## .then() .catch() --- #### Promise.prototype.then(onFulfilled, onRejected) <div style="text-align: left;"><font size = "5"><ul> <li>.then() 方法回傳一個 Promise 物件。它接收兩個引數: Promise 在成功及失敗情況時的回呼函式。</li></ul></font></div> <br> #### Promise.prototype.catch(onRejected) <div style="text-align: left;"><font size = "5"><ul> <li> .catch() 方法只處理 Promise 的被拒絕狀態,並回傳一個新的 Promise 物件。</li></ul></font></div> <div style="text-align: left;"><font size = "5"><ul> <li>此方法是.then()的語法糖等同於呼叫: Promise.prototype.then(undefined, onRejected) </li></ul></font></div> --- ### 由於 .then() 以及 .catch() 方法都回傳 Promise,它們可以被串接 ### 稱為組合(composition) --- ## 組合(composition) ## Promise chain(鏈) ```javascript firstStep() .then( secondStep ) .then( thirdStep ) ... ``` --- <div style="text-align: left;"><font size = "3">藍線表示執行的.then()路徑,紅路表示拒絕的.catch()路徑。 注意:`.then` `.catch`不是拿來當作`if...else`使用</font></div> ![](https://i.imgur.com/87WovnM.png) --- ## 範例程式(Promise chain) <div style="text-align: left;"><font size = "4.5"> ```javascript= function promiseGenerator(time, isResolve) { return new Promise((resolve, reject) => { setTimeout(() => { isResolve ? resolve('任務成功印出resolve') : reject('任務失敗印出reject'); }, time * 1000); }) } promiseGenerator(1, true) .then(success => { alert(success) success += `,然後接著catch接到`; throw Error(success); }) .catch(err => { alert(err) err += `,接著又被then接住`; return err; }) .then(success => { alert(success) return promiseGenerator(5, false) }) .then(success => { alert(success) }) .catch(failed => { alert(failed) }) ``` </font></div> --- # Thank you ---
{"metaMigratedAt":"2023-06-15T09:19:19.642Z","metaMigratedFrom":"Content","title":"Promise","breaks":true,"contributors":"[{\"id\":\"30e59c9a-3d1d-4bc1-8daa-c97ff56595a3\",\"add\":5785,\"del\":2463}]"}
    401 views