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

node.js學(xué)習(xí)之事件模塊Events的使用示例

 更新時(shí)間:2017年09月28日 10:35:52   作者:NextStand  
Nodejs中不存在瀏覽器中冒泡,捕獲這些行為,Nodejs中實(shí)現(xiàn)了events這個(gè)模塊,Nodejs中大多數(shù)模塊都集成了這個(gè)模塊,所以events是Nodejs中最重要的一個(gè)模塊。這篇文章主要給大家介紹了關(guān)于node.js學(xué)習(xí)教程之事件模塊Events的相關(guān)資料,需要的朋友可以參考下。

前言

本文主要給大家介紹了關(guān)于node.js事件模塊Events使用的一些示例,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

環(huán)境:Node v8.2.1; Npm v5.3.0; OS Windows10

1、 Node事件介紹

Node大多數(shù)核心 API 都采用慣用的異步事件驅(qū)動(dòng)架構(gòu),其中某些類(lèi)型的對(duì)象(觸發(fā)器)會(huì)周期性地觸發(fā)命名事件來(lái)調(diào)用函數(shù)對(duì)象(監(jiān)聽(tīng)器)。

所有能觸發(fā)事件的對(duì)象都是 EventEmitter 類(lèi)的實(shí)例。 這些對(duì)象開(kāi)放了一個(gè) eventEmitter.on() 函數(shù),允許將一個(gè)或多個(gè)函數(shù)綁定到會(huì)被對(duì)象觸發(fā)的命名事件上。 事件名稱(chēng)通常是駝峰式的字符串,但也可以使用任何有效的 JavaScript 屬性名。

當(dāng) EventEmitter 對(duì)象觸發(fā)一個(gè)事件時(shí),所有綁定在該事件上的函數(shù)都被同步地調(diào)用。 監(jiān)聽(tīng)器的返回值會(huì)被丟棄。

2、events 模塊API介紹

3、 一些例子

下面是一些簡(jiǎn)單的例子,對(duì)應(yīng)上面的API的一個(gè)代碼實(shí)現(xiàn)

3.1 綁定和觸發(fā)事件

const EventEmitter = require('events');

//自定義一個(gè)對(duì)象繼承于EventEmitter
class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.on('event', () => {
 console.log('觸發(fā)了一個(gè)事件!');
});

myEmitter.emit('event');

3.2 為事件傳遞參數(shù)

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', (a,b) => {
 console.log(a,b);
 //1,2
}); 
myEmitter.emit('event','a','b');

3.3 this 的問(wèn)題

當(dāng)一個(gè)普通的監(jiān)聽(tīng)器函數(shù)被 EventEmitter 調(diào)用時(shí),標(biāo)準(zhǔn)的 this 關(guān)鍵詞會(huì)被設(shè)置指向監(jiān)聽(tīng)器所附加的 EventEmitter。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', function() {
 console.log(this);
 /*
  a b MyEmitter {
   domain: null,
   _events: { event: [Function] },
   _eventsCount: 1,
   _maxListeners: undefined 
  }
 */
 }); 
myEmitter.emit('event');

也可以使用 ES6 的箭頭函數(shù)作為監(jiān)聽(tīng)器。但是這樣 this 關(guān)鍵詞就不再指向 EventEmitter 實(shí)例:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', () => {
 console.log(this);
 //{}
});

myEmitter.emit('event');

3.4 異步執(zhí)行

EventListener 會(huì)按照監(jiān)聽(tīng)器注冊(cè)的順序同步地調(diào)用所有監(jiān)聽(tīng)器,監(jiān)聽(tīng)器函數(shù)可以使用 setImmediate()process.nextTick() 方法切換到異步操作模式:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', (a,b) => {
 setImmediate(()=>{
  //異步觸發(fā)
  console.log(a,b);
 })
 console.log("c");
});

myEmitter.emit('event','a','b');
//c
//a b

3.5 無(wú)限次觸發(fā)和一次觸發(fā)

事件默認(rèn)是可以無(wú)限次數(shù)的觸發(fā)的,只要觸發(fā)一次,對(duì)應(yīng)的監(jiān)聽(tīng)函數(shù)就執(zhí)行一次;有時(shí)候我們希望只執(zhí)行一次監(jiān)聽(tīng)函數(shù),可以使用【once】對(duì)事件進(jìn)行綁定

多次觸發(fā):

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

let m = 0;

myEmitter.on('event', () => {
 console.log(++m);
});

myEmitter.emit('event'); //1

myEmitter.emit('event'); //2

myEmitter.emit('event'); //3

一次觸發(fā):

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

let m = 0;

myEmitter.once('event', () => {
 console.log(++m);
});

myEmitter.emit('event'); //1

myEmitter.emit('event'); //忽略

myEmitter.emit('event'); //忽略

3.6 錯(cuò)誤事件

當(dāng) EventEmitter 實(shí)例中發(fā)生錯(cuò)誤時(shí),會(huì)觸發(fā)一個(gè) ‘error' 事件,如果 EventEmitter 沒(méi)有為 ‘error' 事件注冊(cè)至少一個(gè)監(jiān)聽(tīng)器,則當(dāng) ‘error' 事件觸發(fā)時(shí),會(huì)拋出錯(cuò)誤、打印堆棧跟蹤、且退出 Node.js 進(jìn)程。

const EventEmitter = require('events');

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.emit("error", new Error('whoops!'));
// 拋出錯(cuò)誤,并使 Node.js 崩潰

為了防止 Node.js 進(jìn)程崩潰,可以在 process 對(duì)象的 uncaughtException 事件上注冊(cè)監(jiān)聽(tīng)器

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();
//在進(jìn)程上面注冊(cè)錯(cuò)誤監(jiān)聽(tīng),使進(jìn)程不崩潰
process.on("uncaughtException",()=>{
 console.error('有錯(cuò)誤');
});

myEmitter.emit("error",new Error("whoops"))

上面這樣的方式并不是最佳實(shí)踐,最好是為【error】注冊(cè)監(jiān)聽(tīng)函數(shù)

3.7 獲取和修改最大事件監(jiān)聽(tīng)數(shù)量

Node默認(rèn)一個(gè)事件的監(jiān)聽(tīng)數(shù)量為10個(gè),超過(guò)十個(gè)將會(huì)發(fā)出警告

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

console.log(EventEmitter.defaultMaxListeners); //10

for (let i = 0; i < 11; i++) {
 myEmitter.on("event", () => {
  console.log(i);
 });
}
myEmitter.emit("event")
//MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 event listeners added. Use emitter.setMaxListeners() to increase limit

改變指定的 EventEmitter 實(shí)例的監(jiān)聽(tīng)器限制

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter();

myEmitter.setMaxListeners(13);

for (let i = 0; i < 11; i++) {
 myEmitter.on("event", () => {
  console.log(i);
 });
}
myEmitter.emit("event")

3.8 newListener事件

EventEmitter 實(shí)例會(huì)在一個(gè)監(jiān)聽(tīng)器被添加到其內(nèi)部監(jiān)聽(tīng)器數(shù)組【之前】觸發(fā)自身的 ‘newListener' 事件

const EventEmitter = require('events')

class MyEmitter extends EventEmitter { }

const myEmitter = new MyEmitter()

myEmitter.once("newListener", (event, listener) => {
 if(event === "event"){
  myEmitter.on("event",()=>{
   console.log("B");
  })
 }
});

myEmitter.on("event",()=>{
 console.log("A");
});

myEmitter.emit("event")
/*
B
A
*/

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • node.js中的fs.realpathSync方法使用說(shuō)明

    node.js中的fs.realpathSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.realpathSync方法使用說(shuō)明,本文介紹了fs.realpathSync的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • win7下安裝配置node.js+express開(kāi)發(fā)環(huán)境

    win7下安裝配置node.js+express開(kāi)發(fā)環(huán)境

    windows7下安裝nodejs及框架express,從誕生至今一直被熱捧,筆者最近也裝了個(gè)環(huán)境打算了解一下。安裝步驟簡(jiǎn)單比較簡(jiǎn)單,這里分享給大家,希望大家能夠喜歡。
    2015-12-12
  • Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法

    Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法

    本篇文章主要介紹了Node.js的Koa實(shí)現(xiàn)JWT用戶(hù)認(rèn)證方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 詳解nodejs的express如何自動(dòng)生成項(xiàng)目框架

    詳解nodejs的express如何自動(dòng)生成項(xiàng)目框架

    本篇文章主要介紹了nodejs的express如何自動(dòng)生成項(xiàng)目框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 在nodejs中創(chuàng)建child process的方法

    在nodejs中創(chuàng)建child process的方法

    這篇文章主要介紹了在nodejs中創(chuàng)建child process的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 詳解nodejs微信公眾號(hào)開(kāi)發(fā)——1.接入微信公眾號(hào)

    詳解nodejs微信公眾號(hào)開(kāi)發(fā)——1.接入微信公眾號(hào)

    本篇文章主要介紹了詳解nodejs微信公眾號(hào)開(kāi)發(fā)——1.接入微信公眾號(hào),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 利用nvm管理多個(gè)版本的node.js與npm詳解

    利用nvm管理多個(gè)版本的node.js與npm詳解

    這篇文章主要給大家介紹了關(guān)于利用nvm管理多個(gè)版本的node.js與npm的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • node.js中的http.response.end方法使用說(shuō)明

    node.js中的http.response.end方法使用說(shuō)明

    這篇文章主要介紹了node.js中的http.response.end方法使用說(shuō)明,本文介紹了http.response.end的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Node.js中 __dirname 的使用介紹

    Node.js中 __dirname 的使用介紹

    這篇文章主要給大家介紹了關(guān)于Node.js中 __dirname使用的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • Node.js利用debug模塊打印出調(diào)試日志的方法

    Node.js利用debug模塊打印出調(diào)試日志的方法

    debug日志打印模塊主要實(shí)現(xiàn)功能是帶命名空間(模塊名)、時(shí)間戳、色彩輸出日志;將日志寫(xiě)入文件;瀏覽器端使用;格式化函數(shù);支持自定義方法。下面這篇文章主要介紹了Node.js利用debug模塊打印出調(diào)試日志的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-04-04

最新評(píng)論

海阳市| 湘潭县| 彰武县| 来凤县| 县级市| 江孜县| 沂源县| 宜兰市| 鞍山市| 英超| 灵石县| 阿城市| 临桂县| 大埔区| 彰化市| 依安县| 胶南市| 什邡市| 塘沽区| 交口县| 灌云县| 贞丰县| 杭锦后旗| 桃园县| 顺平县| 扎鲁特旗| 永春县| 延津县| 大冶市| 沧源| 曲水县| 三台县| 蒙山县| 阳东县| 镇赉县| 长白| 玛纳斯县| 秦安县| 上饶县| 靖边县| 青浦区|