亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

node.js下when.js 的異步編程實踐

2019-11-20 13:49:46
字體:
來源:轉載
供稿:網友

假設一個業務場景:

通過rss地址,獲取rss并保存于文件,rss地址保存于文件中。

完成該場景的業務需要完成3個任務:

1.從文件中讀取rss地址。

2.獲取rss。

3.保存于文件。

最后將這三個任務進行整合。

準備:

存放rss地址的文件,address.txt。

http://programmer.csdn.net/rss_programmer.html
 
任務1:

讀取rss地址文件的內容并通過callback返回。

復制代碼 代碼如下:

var getRssAddress = function(path, callback) {
  fs.readFile(path, {encoding: 'utf8'}, function (err, data) {
    callback(err, data);
  });
}

任務2:

 通過rss地址get到rss,并通過callback返回錯誤或數據。

復制代碼 代碼如下:

var getRss = function(url, callback) {
  var data = '';
  http.get(url, function(res) {
    res.on('data', function(chrunk) {
      data += chrunk;
    });
    res.on('end', function() {
      callback(null, data);
    });
  }).on('error', function(err) {
    callback(err, null);
  });
}

 

任務3:

將rss保存于文件并通過callback返回錯誤。

復制代碼 代碼如下:

var saveRss = function(data, callback) {
  fs.writeFile('rss.txt', data, 'utf8', function(err) {
    callback(err);
  });
}

整合:

復制代碼 代碼如下:

getRssAddress('address.txt', function(err, data) {
  if(err) {
    console.log(err);
    return;
  }
  getRss(data, function(err, data) {
    if(err) {
      console.log(err);
      return;
    }
    saveRss(data, function(err) {
      if(err) console.log(err);
    });
  });
});

上面的代碼是全異步處理,使用最常見的callback處理異步邏輯的返回,好處是標準寫法,大家都能容易接受;壞處是耦合性太強,處理異常麻煩,代碼不直觀,特別是處理業務邏輯復雜和處理任務多的場景,層層的callback會讓人眼冒金星,代碼難以維護。

Promise/A規范的實現之一when.js正是針對這樣的問題域。

讓我們來看一下改造后的代碼。

任務1:

復制代碼 代碼如下:

var getRssAddress = function(path) {
    var deferred = when.defer();
      fs.readFile(path, {encoding: 'utf8'}, function (err, data) {
        if (err) deferred.reject(err);
        deferred.resolve(data);
      });

    return deferred.promise;
}


 
任務2:

復制代碼 代碼如下:

var getRss = function(url) {
  var deferred = when.defer();
    var data = '';
    http.get(url, function(res) {
      res.on('data', function(chrunk) {
        data += chrunk;
      });
      res.on('end', function() {
        deferred.resolve(data);
      });
    }).on('error', function(err) {
      deferred.reject(err);
    });

    return deferred.promise;
}

任務3:

復制代碼 代碼如下:

var saveRss = function(data) {
  var deferred = when.defer();
  fs.writeFile('rss.txt', data, 'utf8', function(err) {
    if(err) deferred.reject(err);
    deferred.resolve();
  });

  return deferred.promise;
}


 

整合:

復制代碼 代碼如下:

getRssAddress('address.txt')
  .then(getRss)
  .then(saveRss)
  .catch(function(err) {
    console.log(err);
  });

解釋:

promise/A規范定義的“Deferred/Promise”模型就是“發布/訂閱者”模型,通過Deferred對象發布事件,可以是完成resolve事件,或者是失敗reject事件;通過Promise對象進行對應完成或失敗的訂閱。

在Promises/A規范中,每個任務都有三種狀態:默認(pending)、完成(fulfilled)、失敗(rejected)。

1.默認狀態可以單向轉移到完成狀態,這個過程叫resolve,對應的方法是deferred.resolve(promiseOrValue);

2.默認狀態還可以單向轉移到失敗狀態,這個過程叫reject,對應的方法是deferred.reject(reason);

3.默認狀態時,還可以通過deferred.notify(update)來宣告任務執行信息,如執行進度;

4.狀態的轉移是一次性的,一旦任務由初始的pending轉為其他狀態,就會進入到下一個任務的執行過程中。

按照上面的代碼。

通過when.defer定義一個deferred對象。

var deferred = when.defer();
異步數據獲取成功后,發布一個完成事件。

deferred.resolve(data);
異步數據獲取失敗后,發布一個失敗事件。

deferred.reject(err);
并且返回Promise對象作為訂閱使用。

return deferred.promise;
訂閱是通過Promise對象的then方法進行完成/失敗/通知的訂閱。

getRssAddress('address.txt')
  .then(getRss)
then有三個參數,分別是onFulfilled、onRejected、onProgress

promise.then(onFulfilled, onRejected, onProgress)
上一個任務被resolve(data),onFulfilled函數就會被觸發,data作為它的參數.

上一個任務被reject(reason),那么onRejected就會被觸發,收到reason。

任何時候,onFulfilled和onRejected都只有其一可以被觸發,并且只觸發一次。

對于處理異常,when.js也提供了極其方便的方法,then能傳遞錯誤,多個任務串行執行時,我們可以只在最后一個then定義onRejected。也可以在最后一個then的后面調用catch函數捕獲任何一個任務的異常。

如此寫法簡單明了。

復制代碼 代碼如下:

getRssAddress('address.txt')
  .then(getRss)
  .then(saveRss)
  .catch(function(err) {
    console.log(err);
  });

Promise給異步編程帶來了巨大的方便,可以讓我們專注于單個任務的實現而不會陷入金字塔厄運,以上代碼僅僅是基本使用,when.js提供的功能遠遠不止本文提到的這些,具體參照官方API。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品美女国产在线| 欧美成人性色生活仑片| 欧美黄色成人网| 国产精品国产亚洲伊人久久| 2021久久精品国产99国产精品| 亚洲精品电影网站| 亚洲伊人久久大香线蕉av| 91久久久国产精品| 欧美性jizz18性欧美| 俺去亚洲欧洲欧美日韩| 国产精品久久久久久久久久免费| 国产一区二区黄| 欧美视频专区一二在线观看| 黑人狂躁日本妞一区二区三区| 欧美日韩人人澡狠狠躁视频| 中文字幕亚洲自拍| 国外成人在线视频| 久久久久久12| 久久亚洲国产精品成人av秋霞| 色综合天天狠天天透天天伊人| 亚洲91精品在线观看| 欧美孕妇毛茸茸xxxx| 黄色成人在线播放| 久久中国妇女中文字幕| 欧美午夜美女看片| 热99精品里视频精品| 国产国产精品人在线视| 国产精品久久久| 日本精品视频网站| 国产精品入口日韩视频大尺度| 国产一区二区在线免费视频| 久久久久久69| 国产精品久久久久久久久久99| 成人免费自拍视频| 亲爱的老师9免费观看全集电视剧| 亚洲免费伊人电影在线观看av| 欧美最猛性xxxxx(亚洲精品)| 日韩在线播放一区| 日韩av日韩在线观看| 亚洲第一免费网站| 亚洲男人天天操| 日韩最新中文字幕电影免费看| 亚洲最大在线视频| 久久伊人免费视频| 91精品成人久久| 日韩欧美在线视频日韩欧美在线视频| 在线国产精品视频| 欧美一区三区三区高中清蜜桃| 国产精品69精品一区二区三区| 91在线无精精品一区二区| 在线看国产精品| 久久精品视频中文字幕| 精品精品国产国产自在线| 国语自产精品视频在线看| 日韩美女视频免费看| 精品欧美国产一区二区三区| 91美女片黄在线观| 在线播放亚洲激情| 欧美精品做受xxx性少妇| 欧美大全免费观看电视剧大泉洋| 一区二区三区动漫| 国产精品久久久久久中文字| 国语自产精品视频在线看一大j8| 亚洲一级黄色片| 亚洲第一区在线| 国产视频综合在线| 亚洲天堂久久av| 日韩欧美高清在线视频| 成人免费淫片视频软件| 亚洲大尺度美女在线| 日韩av手机在线看| 成人免费在线视频网站| 国产欧美最新羞羞视频在线观看| 91精品啪在线观看麻豆免费| 亚洲欧美激情四射在线日| 亚洲成在人线av| 国产日韩在线播放| 亚洲欧美色婷婷| 国产精品99蜜臀久久不卡二区| 国产一区二区在线播放| 91欧美激情另类亚洲| 国产日韩中文字幕在线| 欧美精品生活片| 国产精品美乳在线观看| 亚洲最新av在线网站| 伊人成人开心激情综合网| 68精品国产免费久久久久久婷婷| 国产亚洲欧美日韩精品| 亚洲精品91美女久久久久久久| 永久免费看mv网站入口亚洲| 91久久在线视频| 亚洲精品v欧美精品v日韩精品| 91精品国产91久久久| 亚洲国产中文字幕在线观看| 日韩精品在线看| 久久久久久久电影一区| 欧美美女18p| 日韩久久免费电影| 成人免费视频在线观看超级碰| 亚洲影院高清在线| 国外成人在线直播| 日韩av一区二区在线| 欧美肥婆姓交大片| 亚洲成人动漫在线播放| 欧美一级电影免费在线观看| 午夜美女久久久久爽久久| 一区二区三区国产视频| 欧美精品成人91久久久久久久| 久久九九热免费视频| 日韩成人av在线| 91精品国产乱码久久久久久蜜臀| 俺去啦;欧美日韩| 亚洲精品自拍偷拍| 欧美性jizz18性欧美| 亚洲激情免费观看| 亚洲久久久久久久久久久| 日韩av电影在线免费播放| 97人洗澡人人免费公开视频碰碰碰| 日韩精品极品在线观看| 91精品国产综合久久香蕉的用户体验| 美乳少妇欧美精品| 亚洲精品综合久久中文字幕| 成人在线播放av| 欧美高清无遮挡| 国产日韩欧美中文在线播放| 国产成人精品久久亚洲高清不卡| 91麻豆国产语对白在线观看| 奇米成人av国产一区二区三区| 国产成人精品优优av| 欧美精品在线免费| 亚洲精品不卡在线| 91精品在线播放| 日韩欧美亚洲范冰冰与中字| 人妖精品videosex性欧美| 中文字幕一区日韩电影| 日韩av在线免费观看| 欧美日韩爱爱视频| 九九精品视频在线| 亚洲最大在线视频| 中文字幕亚洲一区二区三区| 欧美性一区二区三区| 日韩av中文在线| 亚洲国产97在线精品一区| 亚洲国产成人精品久久久国产成人一区| 欧美日韩在线另类| 国产精品视频网| 精品久久香蕉国产线看观看亚洲| 久久久亚洲国产天美传媒修理工| 欧美电影第一页| 欧美精品国产精品日韩精品| 久久在线免费视频| 久久99久久亚洲国产| 日本成熟性欧美| 国产精品精品久久久久久| 久久天天躁日日躁| 亚洲自拍av在线| 久久免费视频观看| 成人激情电影一区二区| 正在播放欧美视频| 成人福利网站在线观看| 萌白酱国产一区二区| 精品国产成人av| 97国产精品人人爽人人做| 97精品久久久中文字幕免费|