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

首頁 > 編程 > JavaScript > 正文

Nodejs異步回調的優雅處理方法

2019-11-20 14:06:33
字體:
來源:轉載
供稿:網友

前言

Nodejs最大的亮點就在于事件驅動, 非阻塞I/O 模型,這使得Nodejs具有很強的并發處理能力,非常適合編寫網絡應用。在Nodejs中大部分的I/O操作幾乎都是異步的,也就是我們處理I/O的操作結果基本上都需要在回調函數中處理,比如下面的這個讀取文件內容的函數:

復制代碼 代碼如下:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  console.log(data);
});

那,我們讀取兩個文件,將這兩個文件的內容合并到一起處理怎么辦呢?大多數接觸js不久的人可能會這么干:

復制代碼 代碼如下:

fs.readFile('/etc/passwd', function (err, data) {
  if (err) throw err;
  fs.readFile('/etc/passwd2', function (err, data2) {
    if (err) throw err;
    // 在這里處理data和data2的數據
  });
});

那要是處理多個類似的場景,豈不是回調函數一層層的嵌套啊,這就是大家常說的回調金字塔或回調地獄(http://callbackhell.com/)的問題,也是讓js小白最為頭疼的問題。

這種層層嵌套的代碼給開發帶來了很多問題,主要體現在:

1.代碼可能性變差
2.調試困難
3.出現異常后難以排查

本文主要是介紹如何優雅的處理以上異步回調問題。

初級方案:通過遞歸處理異步回調

我們可以使用遞歸作為代碼的執行控制工具。把需要執行的操作封裝到一個函數中,在回調函數中通過遞歸調用控制代碼的執行流程,廢話不多說,上個代碼吧:

復制代碼 代碼如下:

var fs = require('fs');
// 要處理的文件列表
var files = ['file1', 'file2', 'file3'];

function parseFile () {
  if (files.length == 0) {
    return;
  }
  var file = files.shift();
  fs.readFile(file, function (err, data) {
    // 這里處理文件數據
    parseFile();  // 處理完畢后,通過遞歸調用處理下一個文件
  });
}

// 開始處理
parseFile();

以上代碼已依次處理數組中的文件為例,介紹了通過遞歸的方式控制代碼的執行流程。

應用到一些簡單的場景中還是不錯的,比如:我們將一個數組中的數據,依次保存到數據庫中就可以采用這種方式。

通過遞歸的方式可以解決一些簡單的異步回調問題。不過對于處理復雜的異步回調還是顯得有些無能為力(如需要同步多個異步操作的結果)。

華麗點:采用Async、Q、Promise等第三方庫處理異步回調

為了更好的處理嵌套回調的問題,可以考慮采用一些第三方專門處理異步的庫,當然有能力的完全可以自己寫個異步處理的輔助工具。

比較常用的處理異步的庫有:async,q還有promise。從npmjs.org網站上來看,async的火熱程度最高。以前用過async,確實也挺方便的,各種異步處理的控制流實現的也挺好。

我們將最初的同時讀取兩個文件的代碼使用async處理下,示例如下:

復制代碼 代碼如下:

var async = require('async')
  , fs = require('fs');

async.parallel([
  function(callback){
    fs.readFile('/etc/passwd', function (err, data) {
      if (err) callback(err);
      callback(null, data);
    });
  },
  function(callback){
    fs.readFile('/etc/passwd2', function (err, data2) {
      if (err) callback(err);
      callback(null, data2);
    });
  }
],
function(err, results){
  // 在這里處理data和data2的數據,每個文件的內容從results中獲取
});

通過async模塊,可以很好的控制異步的執行流程了,也算是解決了層層回調的問題,代碼比以前算是清晰了些,不過依舊還是離不開回調函數。

想想如果能夠在不使用回調函數的情況下,處理異步,豈不是很爽,接下來,我們談談使用ES6的新特性來實現這一目標。

優雅點:擁抱ES6,替代回調函數,解決回調地獄問題

話說EcmaScript Harmony (ES6)給js引入了不少新特性,對ES6不太了解的同學,可以自行百度一下。

在nodejs中使用ES6的新特性,需要用v0.11.x以上的版本才行。

本文介紹的是使用Generator特性替代回調函數,對Generator不了解?可以看看這里。

這里用到了co和thunkify兩個模塊,大家使用npm install命令安裝之。

還是以本文剛開始提到的問題為例,使用generator特性的實例代碼如下:

復制代碼 代碼如下:

var fs = require('fs')
  , co = require('co')
  , thunkify = require('thunkify');

var readFile = thunkify(fs.readFile);

co(function *() {
  var test1 = yield readFile('test1.txt');
  var test2 = yield readFile('test2.txt');
  var test = test1.toString() + test2.toString();
  console.log(test);
})();

處理代碼中的異常也是很簡單的,只需要這樣就OK了:

復制代碼 代碼如下:

try {
  var test1 = yield readFile('test1.txt');
} catch (e) {
  // 在這里處理異常
}

這種代碼是不是優雅很多了?像寫同步代碼一樣處理異步,是不是很爽!

nodejs領域中進行Web開發,最火的框架莫過于express了,值得一提的是express的核心成員TJ大神有領導了一個新的Web框架――koa,宣稱是下一代的Web開發框架,koa真是借助了ES6的generator這一特性,讓我們在開發Web系統的時候避免陷入層層的回調用。

總結

引用一下fibjs項目宣傳的一句話:Less Callback, More Girls - 更少回調, 更多妹子

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线观看网站| 日韩精品欧美国产精品忘忧草| 91免费人成网站在线观看18| 日韩电影网在线| 国产精品99久久久久久www| 欧美精品在线免费观看| 久久人人爽人人爽人人片亚洲| 亚洲图中文字幕| 国产一区二区三区精品久久久| 国产三级精品网站| 国产91免费观看| 欧美一级大片在线免费观看| 国产国产精品人在线视| 欧美午夜www高清视频| 久久久久国产精品www| 亚洲天堂免费在线| 亚洲黄页视频免费观看| 尤物yw午夜国产精品视频| 7777精品久久久久久| 欧美大片va欧美在线播放| 久久色精品视频| 欧美激情2020午夜免费观看| 日韩精品免费一线在线观看| 最近中文字幕mv在线一区二区三区四区| 久久精品视频播放| 欧美第一淫aaasss性| 91精品国产亚洲| 日本久久亚洲电影| 欧美老女人性生活| 亚洲欧美日韩国产中文专区| 亚洲欧美资源在线| 91香蕉国产在线观看| 亚洲第五色综合网| 国产日韩精品视频| 亚洲天堂av女优| 68精品国产免费久久久久久婷婷| 亚洲国产成人精品久久久国产成人一区| 色综合导航网站| 国产精品69av| 91av在线不卡| 一个人www欧美| 国产亚洲成av人片在线观看桃| 久久av.com| 欧美精品一区二区三区国产精品| 亚洲成人精品av| 国产精品久久久久av免费| 欧美视频在线观看免费网址| 亚洲人成在线电影| 欧美劲爆第一页| 在线播放国产一区中文字幕剧情欧美| 欧美激情精品在线| 国产性色av一区二区| 视频在线观看一区二区| 亚洲欧美另类在线观看| 亚洲精品久久久一区二区三区| 亚洲午夜未满十八勿入免费观看全集| 亚洲国产精品免费| 久久精品色欧美aⅴ一区二区| 日韩视频中文字幕| 欧美成人一区二区三区电影| 久久韩国免费视频| 欧美激情一区二区三区成人| 俺去了亚洲欧美日韩| 57pao成人永久免费视频| 国产精品免费福利| 欧美大尺度电影在线观看| 精品久久香蕉国产线看观看亚洲| 久久成人国产精品| 亚洲摸下面视频| 亚洲精品美女久久| 中文字幕精品视频| 国产精品久久久亚洲| 亚洲男子天堂网| 日本亚洲精品在线观看| 亚洲国产欧美一区二区丝袜黑人| 中文亚洲视频在线| 亚洲综合一区二区不卡| 日韩福利伦理影院免费| 奇门遁甲1982国语版免费观看高清| 成人精品久久av网站| 奇米4444一区二区三区| 69久久夜色精品国产7777| 亚洲成人a**站| 亚洲国产成人在线播放| 91青草视频久久| 亚洲综合精品一区二区| 日韩在线观看免费全集电视剧网站| 亚洲aaaaaa| 久久91精品国产| 久久偷看各类女兵18女厕嘘嘘| 久久精品国产一区二区三区| 91免费看片网站| 久久亚洲精品一区二区| 97视频在线观看成人| 久久久中精品2020中文| 久久精品视频在线| 九九九久久国产免费| 日韩欧美a级成人黄色| 亚洲人精品午夜在线观看| 国产精品日日摸夜夜添夜夜av| 久久综合九色九九| 5278欧美一区二区三区| 成人av在线天堂| 国产精品第一视频| 日韩精品极品毛片系列视频| 日韩欧美在线观看视频| 久久天天躁狠狠躁老女人| 国产suv精品一区二区三区88区| 日韩欧美精品免费在线| 欧美电影免费观看电视剧大全| 色偷偷888欧美精品久久久| 亚洲国产精久久久久久| 欧美大片va欧美在线播放| 亚洲自拍偷拍福利| 在线观看国产精品日韩av| 亚洲精品www久久久| 日本一区二区在线免费播放| 国产在线不卡精品| 国产精品永久免费| xxx一区二区| 亚洲精品中文字幕有码专区| 在线看国产精品| 精品国产依人香蕉在线精品| 欧洲亚洲妇女av| 高清一区二区三区日本久| 中文字幕在线看视频国产欧美| 久久精品一区中文字幕| 热久久免费国产视频| 国产精品一二三在线| 黑人狂躁日本妞一区二区三区| …久久精品99久久香蕉国产| 欧美精品久久久久| 欧美性受xxxx白人性爽| 国产婷婷成人久久av免费高清| 国产欧美精品日韩| 精品视频一区在线视频| 日韩高清免费观看| 欧美最顶级丰满的aⅴ艳星| 国产福利精品av综合导导航| 91大神在线播放精品| 成人福利视频网| 久久精品成人欧美大片古装| 日韩av色综合| 欧美日韩第一视频| 欧美性xxxxx极品娇小| 日韩女优在线播放| 久久精品国产一区二区三区| 久久久免费av| 欧美在线欧美在线| 久久综合久久八八| 国产精品亚洲自拍| www.国产一区| 久久99青青精品免费观看| 亚洲午夜性刺激影院| yellow中文字幕久久| 韩国视频理论视频久久| 成人啪啪免费看| 国模极品一区二区三区| 亚洲第一在线视频| 欧美成人高清视频| 国产男人精品视频| 日韩免费电影在线观看| 精品视频一区在线视频| 欧美小视频在线观看|