2.7.Promise

  • Promise?

    • Promise建構函式與Promise.prototype物件的設計, 主要為了Promisify, 也就是要把原本異步或同步的程式碼或函式, 打包成為Promise物件來使用. 包裝後才能使用Promise的語法結構, 也就是異步函式執行流程的語法結構.

    • 在Promise的標準中, then是"然後、接下來"的意思, 這樣設計的主要目的是要能作連鎖(chained)的語法結構,也就是稱之為合成(composition)的一種運算方式, 這也是我們之所以要做Promisify的原因.

  • Promise的架構

    • 使用Promise建構函式時, 必須傳入一個function, 此function需帶有兩個參數: resolve, reject.

    • 這邊可以理解為當沒有發生任何錯誤時將會執行的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();
      });

Last updated