<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • ES6(一):Promise對象

          2018-4-3    seo達人

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

          介紹Promise

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

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

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

          Promise實例

          var pro = function () { return new Promise(function(resolve, reject) { fs.readdir(_dirname, function(err, data) { if (err) {
                          reject(err); //失敗則將Promise對象置為rejected狀態(tài) } else {
                          resolve(data); //成功則將Promise對象置為resolved轉態(tài) }
                  });
              });
          } /*pro是一個函數(shù)
           調用該函數(shù)返回一個Promise實例
          */ var promiseObject = pro(); /*then方法執(zhí)行Resolved和Rejected狀態(tài)的回調函數(shù)*/ 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 方法是定義在構造函數(shù)Promise 的原型對象上的。這個方法為Promise實例添加狀態(tài)改變時的回調函數(shù)。then方法返回一個新的Promise實例,因此then方法后面可以調用then()方法。傳給then()方法的函數(shù),可返回三類值,分別如下:

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

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

          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狀態(tài) } else {
                          resolve(data); //成功則將Promise對象置為resolved轉態(tài) }
                  });
              });
          } var newPro = function(data) { return new Promise(function(resolve, reject) { setTimeout(function(){ resolve(data);
                  },2000);
              });
          }; /*pro是一個函數(shù)
           調用該函數(shù)返回一個Promise實例
          */ var promiseObject = pro(); /*then方法執(zhí)行Resolved和Rejected狀態(tài)的回調函數(shù)*/ 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);//兩秒鐘后才會被執(zhí)行 })
              .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這樣的鏈式寫法,解決了回調函數(shù)的多層嵌套調用。

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

          “回調金字塔”

          多層嵌套

          bluebird庫 + Generator

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


          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://m.sdgs6788.com

          存檔

          亚洲精品NV久久久久久久久久| 久久亚洲中文字幕精品有坂深雪 | 精品久久久无码人妻中文字幕豆芽| 伊人久久大香线蕉综合热线| 久久人与动人物a级毛片| 精品少妇人妻av无码久久| 99久久精品这里只有精品| 思思久久99热只有频精品66| 99久久精品毛片免费播放| 伊人色综合久久天天网| 国产精品久久久久影院嫩草| 亚洲AV伊人久久青青草原| 国产精品久久久久久一区二区三区| 久久亚洲天堂| 久久99国产精品久久| 欧美一区二区久久精品| 久久精品一区二区三区中文字幕| 亚洲中文字幕无码久久精品1| 精品久久久无码中文字幕天天| 久久一日本道色综合久久| 久久久午夜精品| 久久久久一本毛久久久| 一本色道久久88加勒比—综合| 亚洲国产欧美国产综合久久| 欧美午夜精品久久久久久浪潮| 久久成人影院精品777| 亚洲熟妇无码另类久久久| 思思久久99热只有频精品66| 久久综合一区二区无码| 久久久WWW成人免费毛片| 99热都是精品久久久久久| 欧美777精品久久久久网| 久久国产欧美日韩精品| 蜜臀av性久久久久蜜臀aⅴ| 日韩人妻无码一区二区三区久久| 久久青青草视频| 国产美女亚洲精品久久久综合| 欧美精品乱码99久久蜜桃| 亚洲精品无码久久不卡| 欧美亚洲国产精品久久| 无码人妻精品一区二区三区久久|