最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nodejs異步回調(diào)的優(yōu)雅處理方法

 更新時間:2014年09月25日 08:49:52   投稿:junjie  
這篇文章主要介紹了Nodejs異步回調(diào)的優(yōu)雅處理方法,本文使用了ES6中的新特性,用一種十分優(yōu)雅的方式解決了回調(diào)問題,需要的朋友可以參考下

前言

Nodejs最大的亮點就在于事件驅(qū)動, 非阻塞I/O 模型,這使得Nodejs具有很強的并發(fā)處理能力,非常適合編寫網(wǎng)絡(luò)應(yīng)用。在Nodejs中大部分的I/O操作幾乎都是異步的,也就是我們處理I/O的操作結(jié)果基本上都需要在回調(diào)函數(shù)中處理,比如下面的這個讀取文件內(nèi)容的函數(shù):

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

這種層層嵌套的代碼給開發(fā)帶來了很多問題,主要體現(xiàn)在:

1.代碼可能性變差
2.調(diào)試?yán)щy
3.出現(xiàn)異常后難以排查

本文主要是介紹如何優(yōu)雅的處理以上異步回調(diào)問題。

初級方案:通過遞歸處理異步回調(diào)

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

復(fù)制代碼 代碼如下:

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) {
    // 這里處理文件數(shù)據(jù)
    parseFile();  // 處理完畢后,通過遞歸調(diào)用處理下一個文件
  });
}

// 開始處理
parseFile();

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

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

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

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

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

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

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

復(fù)制代碼 代碼如下:

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的數(shù)據(jù),每個文件的內(nèi)容從results中獲取
});

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

想想如果能夠在不使用回調(diào)函數(shù)的情況下,處理異步,豈不是很爽,接下來,我們談?wù)勈褂肊S6的新特性來實現(xiàn)這一目標(biāo)。

優(yōu)雅點:擁抱ES6,替代回調(diào)函數(shù),解決回調(diào)地獄問題

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

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

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

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

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

復(fù)制代碼 代碼如下:

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了:

復(fù)制代碼 代碼如下:

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

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

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

總結(jié)

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

相關(guān)文章

  • Node.js模塊Modules的使用實戰(zhàn)教程

    Node.js模塊Modules的使用實戰(zhàn)教程

    這篇文章主要介紹了Node.js模塊Modules的使用,模塊就是一個聲明了裝飾器@Module()的類。裝飾器@Module()提供了元數(shù)據(jù),以便讓Nest組織應(yīng)用程序結(jié)構(gòu)
    2023-04-04
  • Nodejs?Sequelize手冊學(xué)習(xí)快速入門到應(yīng)用

    Nodejs?Sequelize手冊學(xué)習(xí)快速入門到應(yīng)用

    這篇文章主要為大家介紹了Nodejs?Sequelize手冊學(xué)習(xí)快速入門到應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • node.js中的fs.lstat方法使用說明

    node.js中的fs.lstat方法使用說明

    這篇文章主要介紹了node.js中的fs.lstat方法使用說明,本文介紹了fs.lstat的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 淺談Node 異步IO和事件循環(huán)

    淺談Node 異步IO和事件循環(huán)

    這篇文章主要介紹了淺談Node 異步IO和事件循環(huán),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • nodejs版本過高導(dǎo)致vue2版本的項目無法正常啟動的解決方案

    nodejs版本過高導(dǎo)致vue2版本的項目無法正常啟動的解決方案

    這篇文章主要給大家介紹了關(guān)于nodejs版本過高導(dǎo)致vue2版本的項目無法正常啟動的解決方案,本文小編給大家詳細介紹了如何解決這個問題,如有遇到同樣問題的朋友可以參考下
    2023-11-11
  • node.js Promise對象的使用方法實例分析

    node.js Promise對象的使用方法實例分析

    這篇文章主要介紹了node.js Promise對象的使用方法,結(jié)合實例形式分析了node.js中Promise對象的功能、定義、調(diào)用方法及相關(guān)使用技巧,需要的朋友可以參考下
    2019-12-12
  • nodejs中的fiber(纖程)庫詳解

    nodejs中的fiber(纖程)庫詳解

    這篇文章主要介紹了nodejs中的fiber(纖程)庫詳解,本文講解了node-fibers的安裝、API介紹、方法使用示例等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Nodejs中解決cluster模塊的多進程如何共享數(shù)據(jù)問題

    Nodejs中解決cluster模塊的多進程如何共享數(shù)據(jù)問題

    本篇文章主要介紹了Nodejs中解決cluster模塊的多進程如何共享數(shù)據(jù)問題,有需要的可以了解一下。
    2016-11-11
  • package.json各個屬性說明詳解

    package.json各個屬性說明詳解

    這篇文章主要介紹了package.json各個屬性說明詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 詳解從NodeJS搭建中間層再談前后端分離

    詳解從NodeJS搭建中間層再談前后端分離

    這篇文章主要介紹了詳解從NodeJS搭建中間層再談前后端分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11

最新評論

博客| 天峻县| 安国市| 舞阳县| 蕲春县| 三亚市| 大理市| 富宁县| 麦盖提县| 南通市| 伊春市| 滦南县| 日喀则市| 喀喇| 安岳县| 内黄县| 鸡西市| 阿瓦提县| 醴陵市| 清水河县| 玉门市| 增城市| 舒兰市| 皋兰县| 东安县| 吴桥县| 溆浦县| 深水埗区| 黔西| 缙云县| 石嘴山市| 谷城县| 庆阳市| 灌云县| 城口县| 安庆市| 南丹县| 玛曲县| 安国市| 尚志市| 河源市|