Node.js 事件循環

Node.js 事件循環

Node.js 是單進程單線程應用程序,但是因為 V8 引擎提供的異步執行回調接口,通過這些接口可以處理大量的并發,所以性能非常高。

Node.js 幾乎每一個 API 都是支持回調函數的。

Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。

Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數.


事件驅動程序

Node.js 使用事件驅動模型,當web server接收到請求,就把它關閉然后進行處理,然后去服務下一個web請求。

當這個請求完成,它被放回處理隊列,當到達隊列開頭,這個結果被返回給用戶。

這個模型非常高效可擴展性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)

在事件驅動模型中,會生成一個主循環來監聽事件,當檢測到事件時觸發回調函數。

?

整個事件驅動的流程就是這么實現的,非常簡潔。有點類似于觀察者模式,事件相當于一個主題(Subject),而所有注冊到這個事件上的處理函數相當于觀察者(Observer)。

Node.js 有多個內置的事件,我們可以通過引入 events 模塊,并通過實例化 EventEmitter 類來綁定和監聽事件,如下實例:

// 引入 events 模塊
var events = require('events'); // 創建 eventEmitter 對象 var eventEmitter = new events.EventEmitter();

以下程序綁定事件處理程序:

// 綁定事件及事件的處理程序
eventEmitter.on('eventName', eventHandler);

我們可以通過程序觸發事件:

// 觸發事件
eventEmitter.emit('eventName');

實例

創建 main.js 文件,代碼如下所示:

?

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

接下來讓我們執行以上代碼:
$ node main.js
連接成功。
數據接收成功。 程序執行完畢。

Node 應用程序是如何工作的?

在 Node 應用程序中,執行異步操作的函數將回調函數作為最后一個參數, 回調函數接收錯誤對象作為第一個參數。

接下來讓我們來重新看下前面的實例,創建一個 input.txt ,文件內容如下:

菜鳥教程官網地址:www.runoob.com

創建 main.js 文件,代碼如下:

var fs = require("fs");fs.readFile('input.txt', function (err, data) {if (err){console.log(err.stack);return;}console.log(data.toString());
});
console.log("程序執行完畢");

  

以上程序中 fs.readFile() 是異步函數用于讀取文件。 如果在讀取文件過程中發生錯誤,錯誤 err 對象就會輸出錯誤信息。

如果沒發生錯誤,readFile 跳過 err 對象的輸出,文件內容就通過回調函數輸出。

執行以上代碼,執行結果如下:

程序執行完畢
菜鳥教程官網地址:www.runoob.com

接下來我們刪除 input.txt 文件,執行結果如下所示:

程序執行完畢
Error: ENOENT, open 'input.txt'

因為文件 input.txt 不存在,所以輸出了錯誤信息。

摘自:http://www.runoob.com/nodejs/nodejs-event-loop.html

轉載于:https://www.cnblogs.com/1906859953Lucas/p/9577412.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277360.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277360.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277360.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全國翻譯專業資格(水平)考試

http://www.spta.gov.cn/moreksxx.jsp?lmCodeA02010205轉載于:https://www.cnblogs.com/Danilo/archive/2004/10/31/58821.html

linux文件句柄,【LINUX】使用lsof處理文件恢復、句柄以及空間釋放問題

曾經在生產上遇到過一個df 和 du出現的結果不一致的問題,為了排查到底是哪個進程占用了文件句柄,導致空間未釋放,首先在linux上面,一切皆文件,這個問題可以使用lsof這個BT的命令來處理(這個哈還可以來查詢文件句柄泄露…

android天氣查詢(二)之網絡json數據的獲取

前面一篇文章介紹了如何使用ksoap獲取天氣信息,但是使用的網絡資源受到了限制,所以我們這里會采用第二種方法,可以無限制的獲取。http://m.weather.com.cn/data/101010100.html 但是對應的101010100(北京)我們怎么獲取呢,還有就是…

累.....

今天我真的蔫了,好累,腦子也好濁,但是還好,最終達到了預期的目的。我終于把henry的dataGrid實現了,犯了低級錯誤,和好多人討論,但最終還是henry解決的。那一刻,真的好爽,…

001-pro ant design 升級2.0后變更

一、更新點 1、目錄調整 2、本地代理服務器調整 roadhog→umi 配置方式 在這個config/config.js配置 "proxy": { "/api": { "target": "http://jsonplaceholder.typicode.com/", "changeOrigin": true, "pathRewrite&q…

linux cp 時 略過文件,CentOS下執行cp命令式提示略過文件夾

今天在CentOS下復制一個文件夾到另一個文件夾的時候cp ./res /usr 的時候出現了問題,提示我的是:cp略過了文件夾后來我找了一下在網上search了一下CP命令的用法:CP命令該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同…

屬性頁中的ON_UPDATE_COMMAND_UI

我前面翻譯了一篇文章簡單的談了一下在對話框處理ON_UPDATE_COMMAND_UI 消息。又在www.codeguru.com上看到在屬性頁中處理ON_UPDATE_COMMAND_UI 消息的方法和在對話框中稍有不同。兩者的處理大體上一樣。只是在屬性頁中還需要一個步驟。需要從CPropertySheet派生類,…

linux基礎命令rpm,rpm常用命令集合1

提要:RPM 是 Red Hat Package Manager 的縮寫,原意是Red Hat 軟件包管理;本文介紹RPM,并結合實例來解說RPM手工安裝、查詢等應用;正文:RPM包管理的用途;1、可以安裝、刪除、升級和管理軟件&…

hibernate詳解

Hibernate原理與應用 主要內容 1、引入 2、安裝配置 3、基本概念和CURD 4、HQL和Criteria 5、關聯映射 6、繼承映射 7、集合映射 8、懶加載 9、緩存 10、事務 11、其他 12、Hibernate不適合的場景 13、與JPA的集成(annotation方式) 14、最佳實踐 1、引入 模型不匹配(阻抗不匹配…

Csharp+Asp.net系列教程(四)

邁克老貓 來自:老貓的理想 本教程參考C#和ASP.NET程序設計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。 這次簡述一下操作符 1.算術操作符 算術操作符包括加()、減(-)、乘(*)、除(/)和求余(%)。加減操作符…

linux 腳本 寫更新,用Shell寫的游戲客戶端更新腳本

#!/bin/sh########################################### 客戶端版本更新系統########################################### CLIENT_INIT_VERSION 客戶端新版本,默認是0# CLIENT_OLD_VERSION 客戶端舊版本(存放在VERSION_FILE指定的文件中),當沒有時取CL…

Android Studio 環境搭建參考,jdk10javac命令提示不是內部或外部命令

https://blog.csdn.net/qq_33658730/article/details/78547789 win10下Android Studio和SDK下載、安裝和環境變量配置 http://yanmin99.com/ android-0基礎從入門到精通 環境變量ANDROID_HOMEE:\Program Files (x86)\Android\SdkJAVA_HOMEE:\Program Files\Java\jdk1.8.0_161TO…

報表引擎 - 數據模型

介紹 本文檔是報表模型的數據模型部分,說明平臺報表中涉及的報表數據相關 術語 名稱 說明 數據源 數據源是與數據存儲的連接。支持數據源適配 數據集 定義報表數據來源的一個二維表 參數 報表往往有參數,例如,日報表,當…

linux 刪舊內核,Ubuntu 刪除舊內核的方法

使用Ubuntu時如果系統里安裝了很多內核,會造成多于的啟動列表。想刪掉一些不用的內核方法如下方法一:首先就是使用如下命令,列出所有安裝的內核,下表中,帶有p_w_picpath的就是內核文件。從中選擇要卸載的包&#xff0c…

L2-014 列車調度(隊列模擬:set)

題意: 兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最后從出口離開。在圖中有9趟列車,在入口處按照{…

新架設了一個CVS服務器 --by yp

cvs是個代碼管理的好東東,全稱并發版本控制。不知道的上網查一下資料。 我下載了相關的部分資料和軟件,包括架設服務器的軟件和使用服務的客戶端軟件,都是windows平臺下可用的, 其他平臺下的我都沒下載,因為不會用。在…

@hdu - 6372@ sacul

目錄 descriptionsolutionaccepted codedetailsdescription 定義矩陣 \(A_i\) 是一個大小為 \(p^i*p^i\) 的矩陣,其中 \(p\) 是第 \(c\) 個素數(c 給定),且 \(A_i[x][y] [C(x, y) \mod p > 0]\)(其中 C(x, y) 是組…

實驗室里人越來越少啊!

研二下半學期了。研三的師哥師姐們都忙著找工作,有的已經去工作了。只是偶而來實驗室轉轉。研一的師弟師妹,現在還都有課,實驗室也沒他們的機器,所以幾乎不來實驗室。我們研二的有四個人,兩個北京的。其中一個在外面打…

在一臺機器上搭建多個redis實例

默認Redis程序安裝在/usr/local/redis目錄下; 配置文件:/usr/local/redis/redis.conf,該配置文件中配置的端口為默認端口:6379; Redis的啟動命令路徑:/usr/local/bin/redis-server。 可以指定端口啟動多個R…

2年前 影子

1. 請問您知道 xxxx嗎 ? 麻煩了您? 2. 您在公司待了多長時間了? 3. 您覺得公司怎么樣? 。。。。。。 待續! 轉載于:https://www.cnblogs.com/nucdy/p/11151470.html