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

深入理解Node.js 事件循環(huán)和回調(diào)函數(shù)

 更新時間:2016年11月02日 12:00:19   作者:A_山水子農(nóng)  
這篇文章主要介紹了深入理解Node.js 事件循環(huán)和回調(diào)函數(shù),詳細(xì)的介紹Node.js 事件循環(huán)和Node.js回調(diào)函數(shù),需要學(xué)習(xí)的可以參考一下。

本文詳細(xì)的介紹了Node.js 事件循環(huán)和Node.js回調(diào)函數(shù),廢話不多說了,具體看下面把。

 一、Node.js 事件循環(huán)

Node.js 是單進(jìn)程單線程應(yīng)用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高。Node.js 的每一個 API 都是異步的,并作為一個獨(dú)立線程運(yùn)行,使用異步函數(shù)調(diào)用,并處理并發(fā)。Node.js 基本上所有的事件機(jī)制都是用設(shè)計(jì)模式中觀察者模式實(shí)現(xiàn)。Node.js 單線程類似進(jìn)入一個while(true)的事件循環(huán),直到?jīng)]有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù).

1、事件驅(qū)動程序

Node.js 使用事件驅(qū)動模型,當(dāng)web server接收到請求,就把它關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個web請求。當(dāng)這個請求完成,它被放回處理隊(duì)列,當(dāng)?shù)竭_(dá)隊(duì)列開頭,這個結(jié)果被返回給用戶。這個模型非常高效可擴(kuò)展性非常強(qiáng),因?yàn)閣eb server一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅(qū)動IO)。在事件驅(qū)動模型中,會生成一個主循環(huán)來監(jiān)聽事件,當(dāng)檢測到事件時觸發(fā)回調(diào)函數(shù)。

整個事件驅(qū)動的流程就是這么實(shí)現(xiàn)的,非常簡潔。有點(diǎn)類似于觀察者模式,事件相當(dāng)于一個主題(Subject),而所有注冊到這個事件上的處理函數(shù)相當(dāng)于觀察者(Observer)。Node.js 有多個內(nèi)置的事件,我們可以通過引入 events 模塊,并通過實(shí)例化 EventEmitter 類來綁定和監(jiān)聽事件,如下實(shí)例:
  

 // 引入 events 模塊 
var events = require('events'); 
// 創(chuàng)建 eventEmitter 對象 
var eventEmitter = new events.EventEmitter(); 
以下程序綁定事件處理程序: 
// 綁定事件及事件的處理程序 
eventEmitter.on('eventName', eventHandler); 
我們可以通過程序觸發(fā)事件: 
// 觸發(fā)事件 
eventEmitter.emit('eventName'); 

2、實(shí)例

創(chuàng)建 main.js 文件,代碼如下所示:

// 引入 events 模塊 
var events = require('events'); 
// 創(chuàng)建 eventEmitter 對象 
var eventEmitter = new events.EventEmitter(); 
// 創(chuàng)建事件處理程序 
var connectHandler = function connected() { 
  console.log('連接成功。'); 
  // 觸發(fā) data_received 事件 
  eventEmitter.emit('data_received'); 
} 
// 綁定 connection 事件處理程序 
eventEmitter.on('connection', connectHandler); 
// 使用匿名函數(shù)綁定 data_received 事件 
eventEmitter.on('data_received', function(){ 
  console.log('數(shù)據(jù)接收成功。'); 
}); 
// 觸發(fā) connection 事件 
eventEmitter.emit('connection'); 
console.log("程序執(zhí)行完畢。"); 

二、Node.js 回調(diào)函數(shù)

Node.js 異步編程的直接體現(xiàn)就是回調(diào)。異步編程依托于回調(diào)來實(shí)現(xiàn),但不能說使用了回調(diào)后程序就異步化了?;卣{(diào)函數(shù)在完成任務(wù)后就會被調(diào)用,Node 使用了大量的回調(diào)函數(shù),Node 所有 API 都支持回調(diào)函數(shù)。例如,我們可以一邊讀取文件,一邊執(zhí)行其他命令,在文件讀取完成后,我們將文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)返回。這樣在執(zhí)行代碼時就沒有阻塞或等待文件 I/O 操作。這就大大提高了 Node.js 的性能,可以處理大量的并發(fā)請求。

1、阻塞代碼實(shí)例

創(chuàng)建一個文件 test.txt ,內(nèi)容如下:

Hello World! 
fs.readFileSync() 
fs.readFile() 

創(chuàng)建 test.js 文件, 代碼如下:

console.log('-------程序開始執(zhí)行--------');  
// 引入fs模塊 
var fs = require("fs"); 
//同步讀取文件 
var data = fs.readFileSync('test.txt','utf-8'); 
console.log(data.toString()); 
console.log('-------程序執(zhí)行結(jié)束--------'); 

以上代碼執(zhí)行結(jié)果如下:

2、非阻塞代碼實(shí)例

創(chuàng)建 test.js 文件, 代碼如下:

console.log('-------程序開始執(zhí)行--------');  
// 引入fs模塊 
var fs = require("fs"); 
//異步讀取文件 
fs.readFile('test.txt','utf-8',function (err, data) { 
  if (err) return console.error(err); 
  console.log(data.toString()); 
}); 
console.log('-------程序執(zhí)行結(jié)束--------');  

以上程序中 fs.readFile() 是異步函數(shù)用于讀取文件。如果在讀取文件過程中發(fā)生錯誤,錯誤 err 對象就會輸出錯誤信息。如果沒發(fā)生錯誤,readFile 跳過 err 對象的輸出,文件內(nèi)容就通過回調(diào)函數(shù)輸出。

以上代碼執(zhí)行結(jié)果如下:
接下來我們刪除 input.txt 文件,執(zhí)行結(jié)果如下所示:
 以上兩個實(shí)例我們了解了阻塞與非阻塞調(diào)用的不同。第一個實(shí)例在文件讀取完后才執(zhí)行完程序。第二個實(shí)例我們不需要等待文件讀取完,這樣就可以在讀取文件時同時執(zhí)行接下來的代碼,大大提高了程序的性能。因此,阻塞按是按順序執(zhí)行的,而非阻塞是不需要按順序的,所以如果需要處理回調(diào)函數(shù)的參數(shù),我們就需要寫在回調(diào)函數(shù)內(nèi)。

三、fs.readFileSync和fs.readFile

1、s.readFileSync

語法:fs.readFileSync(filename, [encoding]) 

接收參數(shù):

  filename:文件路徑

  options:option對象,包含 encoding,編碼格式,該項(xiàng)是可選的。

 由于Node.js僅支持如下編碼:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB2312之類的編碼,因此如果要讀寫GBK或GB2312格式的文件的中文內(nèi)容,必須要用額外的模塊:iconv-lite。

2、fs.readFile

語法:fs.readFile(filename, [encoding], [callback(err,data)])

接收參數(shù):

  filename:文件路徑

  options :option對象,包含 encoding,編碼格式,該項(xiàng)是可選的。

  callback :回調(diào),傳遞2個參數(shù) 異常err 和 文件內(nèi)容 data

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • node中使用shell腳本的方法步驟

    node中使用shell腳本的方法步驟

    這篇文章主要介紹了node中使用shell腳本的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • node.js使用npm 安裝插件時提示install Error: ENOENT報(bào)錯的解決方法

    node.js使用npm 安裝插件時提示install Error: ENOENT報(bào)錯的解決方法

    這篇文章主要介紹了node.js使用npm 安裝插件時提示install Error: ENOENT報(bào)錯的解決方法,需要的朋友可以參考下
    2014-11-11
  • 究竟什么是Node.js?Node.js有什么好處?

    究竟什么是Node.js?Node.js有什么好處?

    這篇文章主要介紹了究竟什么是Node.js?Node.js有什么好處?,為試圖解釋什么是 Node.js,本文將簡要介紹一些背景信息:它要解決的問題,它如何工作,如何運(yùn)行一個簡單應(yīng)用程序,最后,Node 在什么情況下是一個好的解決方案,需要的朋友可以參考下
    2015-05-05
  • Node.JS段點(diǎn)續(xù)傳:Nginx配置文件分段下載功能的實(shí)現(xiàn)方法

    Node.JS段點(diǎn)續(xù)傳:Nginx配置文件分段下載功能的實(shí)現(xiàn)方法

    在Node.JS中可以配置這個標(biāo)簽來實(shí)現(xiàn)文件的分段下載。這篇文章給大家介紹了Node.JS段點(diǎn)續(xù)傳:Nginx配置文件分段下載功能的實(shí)現(xiàn)方法,需要的朋友參考下吧
    2018-03-03
  • 如何用nvm管理眾多nodejs版本詳細(xì)教程

    如何用nvm管理眾多nodejs版本詳細(xì)教程

    NVM是一個nodejs的版本管理工具,nvm和n都是node.js版本管理工具,為了解決node.js各種版本存在不兼容現(xiàn)象可以通過它可以安裝和切換不同版本的 node.js,這篇文章主要介紹了如何用nvm管理眾多nodejs版本的相關(guān)資料,需要的朋友可以參考下
    2025-04-04
  • Nodejs全局安裝和本地安裝的不同之處

    Nodejs全局安裝和本地安裝的不同之處

    這篇文章主要介紹了Nodejs全局安裝和本地安裝的不同之處的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • yarn安裝路徑的成功修改并配置環(huán)境

    yarn安裝路徑的成功修改并配置環(huán)境

    Yarn是facebook發(fā)布的一款取代npm的包管理工具,下面這篇文章主要給大家介紹了關(guān)于yarn安裝路徑的成功修改并配置環(huán)境的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • NodeJS使用Range請求實(shí)現(xiàn)下載功能的方法示例

    NodeJS使用Range請求實(shí)現(xiàn)下載功能的方法示例

    本篇使用 NodeJS 的 HTTP 服務(wù)創(chuàng)建客戶端,使用 Range 請求實(shí)現(xiàn)下載功能,本篇使用 NodeJS 的 HTTP 服務(wù)創(chuàng)建客戶端,使用 Range 請求實(shí)現(xiàn)下載功能
    2018-10-10
  • nodejs實(shí)現(xiàn)UDP組播示例方法

    nodejs實(shí)現(xiàn)UDP組播示例方法

    這篇文章主要介紹了nodejs實(shí)現(xiàn)UDP組播示例方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 純異步nodejs文件夾(目錄)復(fù)制功能

    純異步nodejs文件夾(目錄)復(fù)制功能

    這篇文章主要介紹了純異步nodejs文件夾(目錄)復(fù)制功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09

最新評論

绵竹市| 安泽县| 莎车县| 柳州市| 瑞昌市| 山阳县| 南昌县| 靖西县| 汝阳县| 偃师市| 泰来县| 葫芦岛市| 六盘水市| 田阳县| 应城市| 南投市| 双流县| 锡林浩特市| 康定县| 滁州市| 香河县| 沙湾县| 利辛县| 台东市| 商河县| 都江堰市| 海林市| 高清| 广水市| 罗平县| 依兰县| 肥西县| 大余县| 渝中区| 南涧| 东至县| 佛冈县| 田林县| 伊宁县| 怀来县| 祁连县|