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

探索node之事件循環(huán)的實現(xiàn)

 更新時間:2020年10月30日 08:29:32   作者:angula_  
這篇文章主要介紹了探索node之事件循環(huán)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

事件循環(huán)

Node.js 是單進(jìn)程單線程應(yīng)用程序,但是因為 V8 引擎提供的異步執(zhí)行回調(diào)接口,通過這些接口可以處理大量的并發(fā),所以性能非常高。

Node.js 幾乎每一個 API 都是支持回調(diào)函數(shù)的。

Node.js 基本上所有的事件機制都是用設(shè)計模式中觀察者模式實現(xiàn)。

Node.js 單線程類似進(jìn)入一個while(true)的事件循環(huán),直到?jīng)]有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù).

進(jìn)程:CPU執(zhí)行任務(wù)的模塊

線程:模塊中的最小單元

舉個通俗的例子:

cpu比作我們每個人,到飯點吃飯了??梢渣c很多菜(cpu中的進(jìn)程):宮保雞丁,魚香肉絲,酸辣土豆絲。每樣菜具體包含了哪些內(nèi)容(cpu每個進(jìn)程中的線程):宮保雞丁(詳情:黃瓜、胡蘿卜、雞肉、花生米)。而詳情構(gòu)成了宮保雞丁這道菜,吃了以后不餓。就可以干活了,cpu中的進(jìn)程里的線程也是同理。當(dāng)線程完成自己的內(nèi)容將結(jié)果返回給進(jìn)程,進(jìn)程返回給cpu的時候。cpu就能處理日常需求。

  • 單進(jìn)程單線程:一盤炒苦瓜,里面只有苦瓜。
  • 單進(jìn)程多線程:一盤宮保雞丁,里面有黃瓜、胡蘿卜、雞肉、花生米

事件驅(qū)動程序

Node.js使用事件驅(qū)動模型,當(dāng)web server接收到請求,就把它關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個web請求
當(dāng)這個請求完成,它被放回處理隊列,當(dāng)?shù)竭_(dá)隊列開頭,這個結(jié)果就返回給用戶。

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

在事件驅(qū)動模型中,會生成一個主循環(huán)來監(jiān)聽事件,當(dāng)檢測到事件時觸發(fā)回調(diào)函數(shù)。

在這里插入圖片描述

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

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

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

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

//通過程序觸發(fā)事件
eventEmitter.emit('eventName')

示例:

//引入events模塊
let events = require('events');

//創(chuàng)建eventEmitter對象
let eventEmitter = new events.EventEmitter();

//創(chuàng)建事件處理程序
let connectHandle = function connected() {
 console.log('連接成功');
 //觸發(fā)data_received事件
 eventEmitter.emit('data_received')
}

//綁定connection事件處理程序
eventEmitter.on('connection', connectHandle);

//使用匿名函數(shù)綁定data_received事件
eventEmitter.on('data_received', function () {
 console.log('數(shù)據(jù)接收成功');
})

//觸發(fā)connecttion事件
eventEmitter.emit('connection');
console.log('程序執(zhí)行完畢');


// 執(zhí)行結(jié)果:
// 連接成功
// 數(shù)據(jù)接收成功
// 程序執(zhí)行完畢

eventEmitter.emit 是觸發(fā)事件(事件請求),eventEmitter.on是綁定處理事件的處理器(事件處理),事件的請求和處理是分開的,所以是異步。

EventEmitter

node.js所有的異步I/O操作在完成時都會發(fā)送一個事件到事件隊列

node.js里面的許多對象都會分發(fā)事件:一個net.Server對象會在每次有新連接時觸發(fā)的一個事件,一個fs.readStream對象會在文件被打開的時候觸發(fā)一個事件。所有這些產(chǎn)生事件的對象都是events.EventEmitter的實例

events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是事件觸發(fā)與事件監(jiān)聽器功能的封裝。

EventEmitter 對象如果在實例化時發(fā)生錯誤,會觸發(fā) error 事件。當(dāng)添加新的監(jiān)聽器時,newListener 事件會觸發(fā),當(dāng)監(jiān)聽器被移除時,removeListener 事件被觸發(fā)。

簡單用法

var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
event.on('some_event', function() { 
  console.log('some_event 事件觸發(fā)'); 
}); 
setTimeout(function() { 
  event.emit('some_event'); 
}, 1000); 

運行這段代碼,1 秒后控制臺輸出了 ‘some_event 事件觸發(fā)'。
其原理是 event 對象注冊了事件 some_event 的一個監(jiān)聽器,
然后我們通過 setTimeout 在 1000 毫秒以后向 event 對象發(fā)送事件 some_event,此時會調(diào)用some_event 的監(jiān)聽器。

EventEmitter 的每個事件由一個事件名和若干個參數(shù)組成,事件名是一個字符串,通常表達(dá)一定的語義。對于每個事件,EventEmitter 支持 若干個事件監(jiān)聽器。

當(dāng)事件觸發(fā)時,注冊到這個事件的事件監(jiān)聽器被依次調(diào)用,事件參數(shù)作為回調(diào)函數(shù)參數(shù)傳遞。

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
  console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
  console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 參數(shù)', 'arg2 參數(shù)'); 
//輸出:
// listener1 arg1 參數(shù) arg2 參數(shù)
// listener2 arg1 參數(shù) arg2 參數(shù)

以上例子中,emitter 為事件 someEvent 注冊了兩個事件監(jiān)聽器,然后觸發(fā)了 someEvent 事件。

運行結(jié)果中可以看到兩個事件監(jiān)聽器回調(diào)函數(shù)被先后調(diào)用。 這就是EventEmitter最簡單的用法。

EventEmitter 提供了多個屬性,如 on 和 emit。on 函數(shù)用于綁定事件函數(shù),emit 屬性用于觸發(fā)一個事件。、

EventEmitter屬性

在這里插入圖片描述

測試

/*
 * @Author: angula
 * @Date: 2020-09-21 22:29:18
 * @LastEditTime: 2020-09-22 11:27:56
 * @FilePath: \JS\Github-前端知識總結(jié)倉庫\studySummary\Node.js學(xué)習(xí)筆記\事件循環(huán)\index2.js
 */
let events = require('events');
let eventEmitter = new events.EventEmitter();

// 監(jiān)聽器1
let listener1 = function listener1() {
 console.log('監(jiān)聽器listener1啟動。。。');
}

// 監(jiān)聽器2
let listener2 = function listener2() {
 console.log('監(jiān)聽器listener2啟動。。。');
}

// 綁定connection事件,處理函數(shù)為listener1
eventEmitter.addListener('connection', listener1);
// 綁定connection事件,處理函數(shù)為listener2
eventEmitter.on('connection', listener2);


//類,返回監(jiān)聽器的數(shù)量

let eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + '個監(jiān)聽器監(jiān)聽連接事件。');


//處理connection事件
eventEmitter.emit('connection');

// 移除綁定的listener1
eventEmitter.removeListener('connection', listener1);
console.log('listener1不再受監(jiān)聽');

//觸發(fā)連接事件
eventEmitter.emit('connection');

eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners + '個監(jiān)聽器連接事件');

console.log('程序執(zhí)行完畢');

執(zhí)行結(jié)果:

在這里插入圖片描述

到此這篇關(guān)于探索node之事件循環(huán)的實現(xiàn)的文章就介紹到這了,更多相關(guān)node 事件循環(huán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • npm鏡像源更改后不生效(附淘寶鏡像源)

    npm鏡像源更改后不生效(附淘寶鏡像源)

    淘寶的NPM鏡像源registry.npm.taobao.org已經(jīng)過期,導(dǎo)致npm?install時出現(xiàn)證書過期錯誤,更換鏡像源至registry.npmmirror.com后,如果仍出現(xiàn)錯誤,可能是項目中的package-lock.json或.npmrc文件鎖定了舊的鏡像源,本文就來介紹一下解決方法,感興趣的可以了解一下
    2024-10-10
  • Node.js?中使用fetch?按JSON格式發(fā)post請求的問題解析

    Node.js?中使用fetch?按JSON格式發(fā)post請求的問題解析

    最近在測試一個api,可以用curl命令直接訪問,指定header相關(guān)配置,request?body(JSON),成功后返回一個JSON,這篇文章主要介紹了Node.js?中使用fetch?按JSON格式發(fā)post請求,需要的朋友可以參考下
    2023-04-04
  • NodeJs項目中關(guān)閉ESLint的方法

    NodeJs項目中關(guān)閉ESLint的方法

    ESLint是一個用來識別 ECMAScript 并且按照規(guī)則給出報告的代碼檢測工具,使用它可以避免低級錯誤和統(tǒng)一代碼的風(fēng)格。這篇文章主要介紹了NodeJs項目中關(guān)閉ESLint的方法,需要的朋友可以參考下
    2018-08-08
  • 詳解Node.js 命令行程序開發(fā)教程

    詳解Node.js 命令行程序開發(fā)教程

    一種編程語言是否易用,很大程度上,取決于開發(fā)命令行程序的能力。本篇文章主要介紹了Node.js 命令行程序開發(fā)教程,有興趣的可以了解一下
    2017-06-06
  • 分析node事件循環(huán)和消息隊列

    分析node事件循環(huán)和消息隊列

    node的好處毋庸置疑,事件驅(qū)動,異步非阻塞I/O,以及處理高并發(fā)的能力深入人心,因此大家喜歡用node做一些小型后臺服務(wù)或者作為中間層和其他服務(wù)配合完成一些大型應(yīng)用場景。
    2021-06-06
  • 從零學(xué)習(xí)node.js之利用express搭建簡易論壇(七)

    從零學(xué)習(xí)node.js之利用express搭建簡易論壇(七)

    這篇文章主要介紹了node.js利用express搭建簡易論壇的方法,我們需要搭建的這個簡易的論壇主要的功能有:注冊、登錄、發(fā)布主題、回復(fù)主題。下面我們來一步步地講解這個系統(tǒng)是如何實現(xiàn)的,需要的朋友可以參考借鑒。
    2017-02-02
  • 詳解node.js中的npm和webpack配置方法

    詳解node.js中的npm和webpack配置方法

    Node.js用c++語言編寫而成的,是一個基于chrome V8引擎的javascript運行環(huán)境。這篇文章主要介紹了詳解node.js中的npm和webpack配置,需要的朋友可以參考下
    2018-01-01
  • node.js中fs文件系統(tǒng)模塊的使用方法實例詳解

    node.js中fs文件系統(tǒng)模塊的使用方法實例詳解

    這篇文章主要介紹了node.js中fs文件系統(tǒng)模塊的使用方法,結(jié)合實例形式詳細(xì)分析了node.js fs文件系統(tǒng)模塊各種常見方法的基本使用技巧與相關(guān)操作注意事項,需要的朋友可以參考下
    2020-02-02
  • 使用npm發(fā)布Node.JS程序包教程

    使用npm發(fā)布Node.JS程序包教程

    這篇文章主要介紹了使用npm發(fā)布Node.JS程序包教程,本文講解了配置package.json、注冊npm帳號、發(fā)布程序包等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Express + Session 實現(xiàn)登錄驗證功能

    Express + Session 實現(xiàn)登錄驗證功能

    本文主要介紹在 Express 框架中,如何使用 Session 來實現(xiàn)用戶登錄身份驗證。對express session實現(xiàn)登錄驗證相關(guān)知識,感興趣的朋友一起看看吧
    2017-09-09

最新評論

克拉玛依市| 洪泽县| 嘉荫县| 安新县| 三门峡市| 宁夏| 永康市| 中方县| 工布江达县| 平昌县| 承德县| 新化县| 汶上县| 遂昌县| 太仆寺旗| 新化县| 乌兰浩特市| 于都县| 濮阳市| 中牟县| 浦江县| 康马县| 鹿邑县| 故城县| 北川| 定南县| 东城区| 淮阳县| 阿克| 穆棱市| 余姚市| 云浮市| 安龙县| 黔东| 肃南| 五常市| 逊克县| 静安区| 图们市| 高雄市| 广南县|