<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          ES6(一):Promise對象

          2018-4-3    seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          介紹Promise

          promise的概念和實現最初來源于社區,用于解決異步編程的回調嵌套問題,即將多級的嵌套改良成順序的代碼行。ES6將其寫入了語言標準,統一了用法,提供了原生的Promise。

          Promise是一個構造函數,用于生成一個Promise實例。Promise實例代表一次異步操作。 它只可能有3種轉態,分別是Pending(未決議)Resolved(完成) 和 Rejected(出錯) 。

          創建一個Promise實例時,其處于Pending狀態,當異步操作完成,執行回調函數的時候,根據回調函數中的err的值,如果err 為空則異步操作成功,否則異步操作失敗。此后,Promise實例的狀態將不再改變。

          Promise實例

          var pro = function () { return new Promise(function(resolve, reject) { fs.readdir(_dirname, function(err, data) { if (err) {
                          reject(err); //失敗則將Promise對象置為rejected狀態 } else {
                          resolve(data); //成功則將Promise對象置為resolved轉態 }
                  });
              });
          } /*pro是一個函數
           調用該函數返回一個Promise實例
          */ var promiseObject = pro(); /*then方法執行Resolved和Rejected狀態的回調函數*/ promiseObject
          .then(doneCallbacks, failCallbacks)
          .catch(function(err) { console.log(err);
          }); var doneCallbacks = function(data) { console.log(data);
          }; var failCallbacks = function(err) { console.log(err)
          };
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29

          catch是then的一個語法糖,相當于

          promiseObject.then(undefined, function(err) {
              console.log(err)
          });
              
          • 1
          • 2
          • 3

          Promise對象的錯誤具有向后傳遞的性質,因此,如果在調用過程拋出異常,則異常總能被最后一個catch捕獲。這也是為什么我們習慣在then的調用后跟隨一個catch調用。

          then的鏈式寫法

          then 方法是定義在構造函數Promise 的原型對象上的。這個方法為Promise實例添加狀態改變時的回調函數。then方法返回一個新的Promise實例,因此then方法后面可以調用then()方法。傳給then()方法的函數,可返回三類值,分別如下:

          • 一個Promise實例
          • 一個普通值
          • 拋出一個異常

          如果返回的是一個新的Promise對象,則下一級的then接收函數在這個Promise實例 狀態發生改變時被觸發執行。因此,then的鏈式寫法,可以按順序執行一系列的異步操作,并且后一個異步操作在前一個完成之后開始。如下代碼實例所示:

          var fs = require('fs'); var pro = function () { return new Promise(function(resolve, reject) { fs.readdir(_dirname, function(err, data) { if (err) {
                          reject(err); //失敗則將Promise對象置為rejected狀態 } else {
                          resolve(data); //成功則將Promise對象置為resolved轉態 }
                  });
              });
          } var newPro = function(data) { return new Promise(function(resolve, reject) { setTimeout(function(){ resolve(data);
                  },2000);
              });
          }; /*pro是一個函數
           調用該函數返回一個Promise實例
          */ var promiseObject = pro(); /*then方法執行Resolved和Rejected狀態的回調函數*/ promiseObject
              .then(function(data){ console.log("fisrt sync op");
                  console.log(data); return newPro(data);//返回一個新的Promise對象 })
              .then(function(data) { console.log("second sync op");
                  console.log(data);//兩秒鐘后才會被執行 })
              .catch(function(err) { console.log(err);
              });
          
          promiseObject.then(undefined, function(err) { console.log(err)
          }); var doneCallbacks = function(data) { console.log(data);
          }; var failCallbacks = function(err) { console.log(err)
          }; 
              
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39
          • 40
          • 41
          • 42
          • 43
          • 44
          • 45
          • 46
          • 47
          • 48
          • 49
          • 50
          • 51
          • 52
          • 53

          把上一級異步調用的結果返回給下一級調用,then這樣的鏈式寫法,解決了回調函數的多層嵌套調用。

          解決異步嵌套回調的更多方案

          “回調金字塔”

          多層嵌套

          bluebird庫 + Generator

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合