首页 > 编程语言 >Node.js 事件

Node.js 事件

时间:2023-08-03 14:45:25浏览次数:40  
标签:Node eventEmitter js connection 事件 events

一、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');

 

三、实例

// 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();

    // 创建事件处理程序
    var connectHandler = function connected(){
        console.log("connection sucess");
        // 触发 data_received 事件 
        eventEmitter.emit('data_reveived');
    }

    // 绑定 connection 事件处理程序
    eventEmitter.on("connection",connectHandler);

    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_reveived',function(){
        console.log('data receive sucess.')
    })
    // 触发 connection 事件 
    eventEmitter.emit("connection")

    console.log('connection');

 

执行结果:

connection sucess
data receive sucess.
connection

 参考:https://m.runoob.com/nodejs/nodejs-event-loop.html

标签:Node,eventEmitter,js,connection,事件,events
From: https://www.cnblogs.com/handsomeziff/p/17603284.html

相关文章

  • Node中fs模块的一些操作API
    ❝这里主要讲一讲node里面fs模块的一些基操!本篇只讲几个API,后续的可能会在其他文章补充!声明:本文的代码是koa2环境中的,是CommonJS的规范,需要使用require引入!❞什么是fsfs全称为filesystem,称之为文件系统,是Node.js中的内置模块,直接导入使用即可!模块中的API,分异步和同步操作......
  • 控制台出现lockdown-install.js文件报Removing intrinsics.问题告警
    查的原因是:警告来自MetaMaskChrome扩展。解决方法:关闭MetaMask扩展程序。参考资料:https://www.jdk5.com/ask/282/what-is-causing-the-warning-removing-intrinsics-arrayprototype-toreversed-in......
  • Nuxt.JS实战指南:从入门到精通的练习之旅
    官网:Nuxt.js-Vue.js通用应用框架|Nuxt.js中文网搭建Nuxt2-参考文献:Nuxt-超详细环境搭建及创建项目整体流程(create-nuxt-app)_王佳斌的博客-CSDN博客一、为什么用NuxtSEO:所搜引擎优化1.1如何进行搜索引擎优化?多页面Title、描述、关键字网站内容1.2-预渲染1.2.1-预渲染图解1.2......
  • 手摸手实现js拍照
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=d......
  • 老杜 JavaWeb 讲解(十八) ——项目优化(Servlet+JSP+EL+JSTL)
    (十六)项目优化(Servlet+JSP+EL+JSTL)相关视频:55-EL表达式JSTL和base标签改造OA新旧代码对比:注意点:Java代码不需要改动,只需要更改jsp代码。将需要的包导入:jakarta.servlet.jsp.jstl-2.0.0.jarjakarta.servlet.jsp.jstl-api-2.0.0.jarmysql-connector-j-8.0.31.j......
  • ThreeJs实现简单的动画
    上一节实现可用鼠标控制相机的方式实现动态效果,但很多时候是需要场景自己产恒动态效果,而不是通过鼠标拖动,此时引入一个requestAnimationFrame方法,它实际上是通过定时任务的方式,每隔一点时间改变场景中内容后重新渲染一遍,间隔时间短的话视觉上就显示出连续的动画效果,Js本身也自带定......
  • 【快应用】同时传递事件对象和自定义参数 ,无法正确接收事件对象
     【关键词】事件绑定、自定义参数、事件对象【问题背景】在快应用中采用如下方式绑定组件的事件方法,同时传递事件对象和自定义参数,发现回调方法中没有正确接收到事件对象。问题代码如下:<template><!--Onlyonerootnodeisallowedintemplate.--><divclass="contain......
  • 【js学习笔记二十二】...扩展运算符
     目录前言导语 代码部分 运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语歌谣歌谣......
  • js 标准时间比较 false 时间戳比较才行
    newDate(),同一时间段的newDate()都是不一样的newDate("ThuAug03202309:59:16GMT+0800(中国标准时间)").getT==newDate("ThuAug03202309:59:16GMT+0800(中国标准时间)")//falsenewDate("ThuAug03202309:59:16GMT+0800(中国标准时间)").getTime()......
  • node封装一个图片拼接插件
    说在前面平时我们拼接图片的时候一般都要通过ps或者其他图片处理工具来进行处理合成,这次有个需求就需要进行图片拼接,而且我希望是可以直接使用代码进行拼接,于是就有了这么一个工具包。插件效果通过该插件,我们可以将图片进行以下操作:1、横向拼接两张图片如下,我们有这么两张......