JavaScript的事件驱动和非阻塞io

事件驱动(Event-Driven):

  1. 事件触发与监听:

    • 在Node.js中,程序的执行是由事件的发生来触发的。通过EventEmitter类,我们可以创建对象,绑定事件监听器,然后触发相应的事件。

    • 示例:

      javascript 复制代码
      const EventEmitter = require('events');
      const myEmitter = new EventEmitter();
      
      myEmitter.on('customEvent', () => {
        console.log('Custom event occurred!');
      });
      
      myEmitter.emit('customEvent');
  2. 回调函数的角色:

    • 回调函数是事件的处理器,它会在事件发生时执行。这样的设计使得程序能够在等待某些操作完成的同时执行其他任务,而不会阻塞整个应用程序。

    • 示例:

      javascript 复制代码
      const fs = require('fs');
      
      fs.readFile('example.txt', 'utf8', (err, data) => {
        if (err) throw err;
        console.log(data);
      });

非阻塞I/O(Non-Blocking I/O):

  1. 异步I/O操作:

    • Node.js通过使用异步I/O接口来处理文件读写、网络请求等操作。这意味着在执行一个I/O操作时,程序不会等待其完成,而是继续执行后续代码。

    • 示例:

      javascript 复制代码
      const fs = require('fs');
      
      fs.readFile('example.txt', 'utf8', (err, data) => {
        if (err) throw err;
        console.log(data);
      });
  2. 事件循环(Event Loop):

    • 事件循环是Node.js的核心,负责监听事件队列并执行相应的回调函数。这保证了在异步I/O操作进行的同时,程序能够继续响应其他事件。

    • 示例:

      javascript 复制代码
      const start = Date.now();
      
      setTimeout(() => {
        console.log('Timeout callback executed after', Date.now() - start, 'milliseconds');
      }, 1000);
      
      setImmediate(() => {
        console.log('Immediate callback executed after', Date.now() - start, 'milliseconds');
      });

通过这种方式,Node.js在事件驱动和非阻塞I/O的基础上,使得程序更具响应性,能够更高效地处理大量并发操作,提高了应用程序的性能。

例子

事件驱动(Event-Driven):

  1. 事件就是一种信号:

    • 想象一下你去咖啡店等咖啡,当你的咖啡好了,服务员会叫你的名字。这个"叫名字"的动作就是一个事件,你的名字是信号。
  2. 回调函数就像接电话:

    • 你不需要一直等在柜台前,只要你的咖啡好了,服务员就会用你的名字呼叫你。在编程中,这种等待的工作就由回调函数来完成。

非阻塞I/O(Non-Blocking I/O):

  1. 异步就是同时做多件事:

    • 想象你在等电梯的时候,不需要一直盯着电梯门。你可以边等电梯边玩手机,等电梯好了,手机不会因此停止工作。在编程中,异步操作就是允许程序同时执行多个任务。
  2. 事件循环就像多任务经理:

    • 把事件循环想象成一个多任务经理,负责调度各种任务。你告诉经理你要等电梯,然后就可以自由去做其他事情。当电梯好了,经理会通知你。

通过这样的比喻,事件驱动就像等咖啡和接电话一样,而非阻塞I/O就像等电梯和同时做多件事一样。这样的编程方式使得程序更加灵活,能够更高效地完成多个任务。

相关推荐
求知若饥43 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
理想不理想v13 小时前
webpack最基础的配置
前端·webpack·node.js
南城巷陌15 小时前
JWT认证机制在Node.js中的详细阐述
node.js·jwt认证机制·前端安全认证
理想不理想v18 小时前
node.js的简单示例
node.js
yrldjsbk18 小时前
使用Node.js搭配express框架快速构建后端业务接口模块Demo
node.js·express
维李设论18 小时前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
CodeChampion20 小时前
60.基于SSM的个人网站的设计与实现(项目 + 论文)
java·vue.js·mysql·spring·elementui·node.js·mybatis
Domain-zhuo20 小时前
如何利用webpack来优化前端性能?
前端·webpack·前端框架·node.js·ecmascript
理想不理想v20 小时前
webpack如何自定义插件?示例
前端·webpack·node.js