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

Node.js原理阻塞和EventEmitter及其繼承的運(yùn)用實(shí)戰(zhàn)

 更新時(shí)間:2022年08月24日 08:30:26   作者:黎燃???????  
這篇文章主要介紹了Node.js原理阻塞和EventEmitter及其繼承的運(yùn)用實(shí)戰(zhàn),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

基本概念

簡(jiǎn)單地說(shuō),Node.js是在服務(wù)器端運(yùn)行的JavaScript。 節(jié)點(diǎn)。

$ node

> console.log('Hello 黎燃!');
Hello 黎燃!

然而,對(duì)于node JS,概念完全不同。

使用node JS,我們不僅實(shí)現(xiàn)了一個(gè)應(yīng)用程序,還實(shí)現(xiàn)了整個(gè)HTTP服務(wù)器。

事實(shí)上,我們的web應(yīng)用程序和相應(yīng)的web服務(wù)器基本相同。 讓我們了解一下node JS應(yīng)用程序由以下部分組成: 1.介紹所需模塊:我們可以使用require命令加載node JS模塊。 2.創(chuàng)建服務(wù)器:服務(wù)器可以監(jiān)聽(tīng)客戶(hù)端的請(qǐng)求,類(lèi)似于Apache和nginx等HTTP服務(wù)器。 3.接收請(qǐng)求并響應(yīng)請(qǐng)求的服務(wù)器很容易創(chuàng)建。客戶(hù)端可以使用瀏覽器或終端發(fā)送HTTP請(qǐng)求,服務(wù)器收到請(qǐng)求后返回響應(yīng)數(shù)據(jù)。

回調(diào)函數(shù)

Node.jsS異步編程的直接體現(xiàn)是回調(diào)。

阻塞代碼

異步編程依賴(lài)于回調(diào),但不能說(shuō)在使用回調(diào)后程序?qū)⑹钱惒降摹?完成任務(wù)后將調(diào)用回調(diào)函數(shù)。節(jié)點(diǎn)使用大量回調(diào)函數(shù)。 節(jié)點(diǎn)的所有API都支持回調(diào)函數(shù)。

讀取文件后,我們返回文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)。 這樣,在執(zhí)行代碼時(shí)就不會(huì)阻塞或等待文件I/O操作。

回調(diào)函數(shù)通常顯示為函數(shù)的最后一個(gè)參數(shù):

function foo1(name, age, callback) { }
function foo2(value, callback1, callback2) { }

創(chuàng)建主JS文件,代碼如下:

var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("程序執(zhí)行結(jié)束!");

非阻塞代碼

創(chuàng)建主JS文件,代碼如下:

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序執(zhí)行結(jié)束!");

在以上兩個(gè)例子中,我們理解阻塞調(diào)用和非阻塞調(diào)用之間的區(qū)別。第一個(gè)實(shí)例在讀取文件后執(zhí)行程序。 在第二個(gè)示例中,我們不需要等待文件被讀取,因此我們可以在讀取文件的同時(shí)執(zhí)行以下代碼,這大大提高了程序的性能。

因此,按順序執(zhí)行阻塞,不需要按順序執(zhí)行非阻塞。

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

 Node.js使用事件驅(qū)動(dòng)模型。 當(dāng)web服務(wù)器接收到一個(gè)請(qǐng)求時(shí),它會(huì)關(guān)閉并處理該請(qǐng)求,然后為下一個(gè)web請(qǐng)求提供服務(wù)。 當(dāng)請(qǐng)求完成時(shí),它將被放回處理隊(duì)列。當(dāng)它到達(dá)隊(duì)列的開(kāi)頭時(shí),結(jié)果將返回給用戶(hù)。 引入 events 模塊

var events = require('events');

創(chuàng)建 eventEmitter 對(duì)象

var eventEmitter = new events.EventEmitter();

綁定事件及事件的處理程序

eventEmitter.on('eventName', eventHandler);

觸發(fā)事件

eventEmitter.emit('eventName');

Node 應(yīng)用程序工作原理

創(chuàng)建主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("程序執(zhí)行完畢");

在上述程序中,F(xiàn)S Readfile()是一個(gè)用于讀取文件的異步函數(shù)。如果在讀取文件期間發(fā)生錯(cuò)誤,error err對(duì)象將輸出錯(cuò)誤消息。

程序執(zhí)行完畢

如果沒(méi)有發(fā)生錯(cuò)誤,readfile將跳過(guò)err對(duì)象的輸出,并通過(guò)回調(diào)函數(shù)輸出文件內(nèi)容。

接下來(lái),我們刪除輸入Txt文件。

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

程序執(zhí)行完畢 Error: ENOENT, open 'input.txt'

EventEmitter 類(lèi)

每次有新連接時(shí),服務(wù)器對(duì)象的net將觸發(fā)事件,而readstream對(duì)象的FS將在文件打開(kāi)時(shí)觸發(fā)事件。所有生成事件的對(duì)象都是EventEmitter實(shí)例中的事件。

引入 events 模塊

var events = require('events');

創(chuàng)建 eventEmitter 對(duì)象

var eventEmitter = new events.EventEmitter();

如果在實(shí)例化EventEmitter對(duì)象期間發(fā)生錯(cuò)誤,將觸發(fā)錯(cuò)誤事件。添加新偵聽(tīng)器時(shí),將觸發(fā)newlistener事件。刪除偵聽(tīng)器時(shí),將觸發(fā)RemovelListener事件。

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); 

運(yùn)行此代碼,控制臺(tái)在1秒_事件觸發(fā)器后輸出'some'。 觸發(fā)事件時(shí),將依次調(diào)用注冊(cè)到此事件的事件偵聽(tīng)器,并將事件參數(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); 
}); 

on(event, listener)

注冊(cè)指定事件的偵聽(tīng)器,并接受字符串事件和回調(diào)函數(shù)。

server.on('connection', function (stream) {
  console.log('someone connected!');
});

繼承 EventEmitter

大多數(shù)時(shí)候,我們不直接使用EventEmitter,而是在對(duì)象中繼承它。 所有支持事件響應(yīng)的核心模塊,包括FS、net和HTTP,都是EventEmitter的子類(lèi)。

  • 1.首先,具有實(shí)體函數(shù)的對(duì)象實(shí)現(xiàn)了符合語(yǔ)義的事件。事件的偵聽(tīng)和發(fā)生應(yīng)該是對(duì)象的一種方法。
  • 2.其次,JavaScript的對(duì)象機(jī)制是基于原型的,支持部分多重繼承。繼承EventEmitter不會(huì)干擾對(duì)象的原始繼承關(guān)系。

到此這篇關(guān)于Node.js原理對(duì)于阻塞和EventEmitter及其繼承的運(yùn)用實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Node.js EventEmitter 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 寶塔部署nodejs項(xiàng)目的實(shí)戰(zhàn)步驟

    寶塔部署nodejs項(xiàng)目的實(shí)戰(zhàn)步驟

    前段時(shí)間部署node項(xiàng)目的時(shí)候出現(xiàn)了一點(diǎn)問(wèn)題,所以想著給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于寶塔部署nodejs項(xiàng)目的實(shí)戰(zhàn)步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • 在Node.js中實(shí)現(xiàn)獲取用戶(hù)頻道信息的功能

    在Node.js中實(shí)現(xiàn)獲取用戶(hù)頻道信息的功能

    在構(gòu)建社交或視頻分享平臺(tái)時(shí),允許用戶(hù)查看其他用戶(hù)的頻道信息是一個(gè)基本需求,本文將介紹如何在Node.js應(yīng)用中,使用Express框架和Mongoose庫(kù)來(lái)實(shí)現(xiàn)這一功能,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-04-04
  • Node.js + express實(shí)現(xiàn)上傳大文件的方法分析【圖片、文本文件】

    Node.js + express實(shí)現(xiàn)上傳大文件的方法分析【圖片、文本文件】

    這篇文章主要介紹了Node.js + express實(shí)現(xiàn)上傳大文件的方法,結(jié)合實(shí)例形式分析了Node.js + express針對(duì)圖片、文本文件上傳操作實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • nodejs搭建本地http服務(wù)器教程

    nodejs搭建本地http服務(wù)器教程

    本篇文章主要介紹了nodejs搭建本地http服務(wù)器教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 使用GruntJS構(gòu)建Web程序之Tasks(任務(wù))篇

    使用GruntJS構(gòu)建Web程序之Tasks(任務(wù))篇

    任務(wù)(Tasks)是grunt的核心概念,你所做的很多工作比如資源合并(concat)、壓縮(uglify)都是在配置任務(wù)。 每次grunt運(yùn)行的時(shí)候,你指定的一個(gè)或多個(gè)任務(wù)也在運(yùn)行,如果你沒(méi)有指定任務(wù),那么一個(gè)默認(rèn)名為“default”的任務(wù)將自動(dòng)運(yùn)行。
    2014-06-06
  • nodejs 實(shí)現(xiàn)模擬form表單上傳文件

    nodejs 實(shí)現(xiàn)模擬form表單上傳文件

    使用nodejs來(lái)模擬form表單進(jìn)行文件上傳,可以同時(shí)上傳多個(gè)文件。
    2014-07-07
  • node版本沖突問(wèn)題的解決方案

    node版本沖突問(wèn)題的解決方案

    因?yàn)轫?xiàng)目用的依賴(lài)和要運(yùn)行環(huán)境的node.js版本起了沖突,下面這篇文章主要給大家介紹了關(guān)于node版本沖突問(wèn)題的解決方案,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Node.js中readline模塊實(shí)現(xiàn)終端輸入

    Node.js中readline模塊實(shí)現(xiàn)終端輸入

    本文主要介紹了Node.js中readline模塊實(shí)現(xiàn)終端輸入,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Node.js?操作本地文件及深入了解fs內(nèi)置模塊

    Node.js?操作本地文件及深入了解fs內(nèi)置模塊

    這篇文章主要介紹了Node.js?操作本地文件及深入了解fs內(nèi)置模塊,node.js作為服務(wù)端應(yīng)用,肯定少不了對(duì)本地文件的操作,像創(chuàng)建一個(gè)目錄、創(chuàng)建一個(gè)文件、讀取文件內(nèi)容等都是我們開(kāi)發(fā)中經(jīng)常需要用到的功能
    2022-09-09
  • node+experss實(shí)現(xiàn)爬取電影天堂爬蟲(chóng)

    node+experss實(shí)現(xiàn)爬取電影天堂爬蟲(chóng)

    本文給大家分享的是node+experss制作爬蟲(chóng)的第二篇,我們來(lái)爬取電影天堂最新更新的電影迅雷下載鏈接,有需要的小伙伴可以參考下
    2016-11-11

最新評(píng)論

启东市| 壤塘县| 永登县| 庄河市| 隆德县| 湘西| 浏阳市| 井研县| 铜川市| 盐源县| 武隆县| 利津县| 远安县| 洞头县| 和龙市| 姜堰市| 鄂托克前旗| 平泉县| 临泽县| 昌都县| 秭归县| 平定县| 雷州市| 象山县| 弥勒县| 镇赉县| 田东县| 法库县| 桂东县| 自治县| 故城县| 微山县| 越西县| 衡水市| 永城市| 丰台区| 双牌县| 洛隆县| 望都县| 老河口市| 昌平区|