# 2.7.Promise

* Promise?
  * Promise建構函式與Promise.prototype物件的設計, 主要為了Promisify, 也就是要把原本異步或同步的程式碼或函式, 打包成為Promise物件來使用. 包裝後才能使用Promise的語法結構, 也就是異步函式執行流程的語法結構.
  * 在Promise的標準中, then是"然後、接下來"的意思, 這樣設計的主要目的是要能作連鎖(chained)的語法結構，也就是稱之為合成(composition)的一種運算方式, 這也是我們之所以要做Promisify的原因.
* Promise的架構
  * 使用Promise建構函式時, 必須傳入一個function, 此function需帶有兩個參數: resolve, reject.&#x20;
  * 這邊可以理解為當沒有發生任何錯誤時將會執行的function就是resolve, 而有例外狀況發生時將會使用到reject. 此外也可以讓Promise物件throw new Error,這樣便可以在使用時catch住例外狀況.
  * (1) 定義一個會回傳Promise物件的function:

    ```
    function asyncFunction(value) {
        return new Promise(function(resolve, reject){
          if (value) {
            try {
              ...
             resolve(a); // 已實現，成功
            } catch (e) {
             throw new Error(e); // error handling
            }
          } else {
            reject(reason); // 有錯誤，已拒絕，失敗
          }
        });
     }
    ```
  * (2)使用Promise物件:

    ```
        asyncFunction(10).then(function(value) {
            // 已實現，成功
            //do something
        }, function(reason) {
            // 有錯誤，已拒絕，失敗
            //do something
        }).catch(function(err) {
            // error handling
        })
    ```
* 實作
  * 由於在專案上碰到了一個情形, 於是便開始著手研究promise: client所需要繳交給server的參數相當多, 於是我就把所有的參數都塞進json中, 再讓server parse 最後將parse後的結果當成參數寫入/查詢資料庫, 此過程中需要在parse json物件後去讀寫資料庫, 是連續的動作, 必須用到像是promise一般的chaining處理流程, 但是Json.parse本身不會回傳promise物件
  * 1.定義Promise物件:

    ```
    function promiseParse(value) {
      return new Promise(function(resolve, reject) {
        if (value) {
          try {
            a = JSON.parse(value);
            resolve(a); // 已實現，成功
          } catch (e) {
            throw new Error(e);
          }
        } else {
          reject(reason); // 有錯誤，已拒絕，失敗
        }
      });
    }
    ```
  * 2.使用Promise物件:

    ```
    var obj = req.body.tester;
    promiseParse(obj).then(function(value) {
        console.log(value.mail);
        console.log(value.name);
    }, function(reason) {
        res.write(reason);
        res.end();
    }).catch(function(err) {
        res.write(err);
        res.end();
    });
    ```
