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就像等电梯和同时做多件事一样。这样的编程方式使得程序更加灵活,能够更高效地完成多个任务。

相关推荐
万敏10 小时前
Vue3 全栈实战:第一阶段复盘(第1-8周)
vue.js·node.js·全栈
濮水大叔12 小时前
舒服了,CabloyJS 的 AI Spec 驱动开发会自动生成甘特图和燃尽图
typescript·node.js·vibecoding
FungLeo14 小时前
成为全栈·Node 后端篇·部署上线:从本地起服到真正对外服务
node.js·后端部署·成为全栈
妙码生花18 小时前
golang 应用服务端部署(使用 systemd 服务)
开发语言·人工智能·后端·golang·node.js·php·gin
柚稚姐姐19 小时前
npm install pnpm -g npm error code EACCES npm error syscall symlink
前端·npm·node.js
FungLeo2 天前
成为全栈·Node 后端篇·容器化:给 Node 应用写一个像样的 Dockerfile
docker·node.js·dockerfile·成为全栈·后端服务容器·docker 容器
WeiXin_DZbishe2 天前
基于springboot大学生提问箱系统-计算机毕设【课程设计】72593
javascript·vue.js·spring boot·vscode·python·node.js·php
xixiaoyunya2 天前
Docker 容器化部署实战:从零搭建一套完整的 Nginx + Node.js + MySQL + Redis 项目环境
nginx·docker·node.js
晴天162 天前
npm install -f(--force)深度解析:作用原理、报错根源与风险避坑指南
前端·npm·node.js
还是大剑师兰特2 天前
Swagger 在 Node.js 项目中的安装和完整使用方法
node.js