Node.js 事件循环和事件派发器

这篇具有很好参考价值的文章主要介绍了Node.js 事件循环和事件派发器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、process.nextTick() 介绍

2、setTimeout()

3、零延迟

4、setInterval()

5、递归setTimeout

6、setImmediate()

7、Node.js 事件派发器


1、process.nextTick() 介绍

Node.js中 process.nextTick函数以一种特殊的方式与事件循环交互。

当你试图理解Node.js事件循环时,它的一个重要部分是process.nextTick()。每次事件循环进行一次完整的行程,我们都称之为tick。

当我们将函数传递给process.nextTick() 时,我们指示引擎在当前操作结束时,在下一个事件循环tick开始之前调用此函数:

process.nextTick(() => {
// do something
});

事件循环正忙于处理当前函数代码。当该操作结束时,JS引擎将运行该操作期间传递给nextTick调用的所有函数。

这是我们可以告诉JS引擎异步处理函数(在当前函数之后)的方法,但要尽快,而不是将其排队。

调用setTimeout(()=>{},0) 将在下一个刻度结束时执行该函数,比使用nextTick() 要晚得多,后者会对调用进行优先级排序,并在下一刻度开始前执行。

当您希望确保在下一次事件循环迭代中该代码已经执行时,请使用nextTick() 。

事件顺序示例

console.log("Hello => number 1");
setImmediate(() => {
	console.log("Running before the timeout => number 3");
});
setTimeout(() => {
	console.log("The timeout running last => number 4");
}, 0);
process.nextTick(() => {
	console.log("Running at next tick => number 2");
});

输出结果:

Hello => number 1
Running at next tick => number 2
Running before the timeout => number 3
The timeout running last => number 4

2、setTimeout()

在编写JavaScript代码时,您可能希望延迟函数的执行。

这是setTimeout的工作。指定一个稍后执行的回调函数,以及一个表示希望它稍后运行的值(以毫秒为单位):

setTimeout(() => {
// runs after 2 seconds
}, 2000);
setTimeout(() => {
// runs after 50 milliseconds
}, 50);

此语法定义了一个新函数。你可以调用你想要的任何其他函数,也可以传递一个现有的函数名一组参数

const myFunction = (firstParam, secondParam) => {
// do something
  console.log(firstParam + ' ' + secondParam)
};
// runs after 2 seconds
setTimeout(myFunction, 2000, "zhang", "san");

setTimeout返回计时器id。通常不使用此id,但您可以存储此id,如果您想删除此计划的函数执行,则可以将其清除:

const id = setTimeout(() => {
// should run after 2 seconds
}, 2000);
// I changed my mind
clearTimeout(id);

3、零延迟

如果将超时延迟指定为0,回调函数将尽快执行,但在当前函数执行之后:

setTimeout(() => {
console.log('after ');
}, 0);
console.log(' before ');

代码将会打印:

before
after

这对于避免在密集任务上阻塞CPU,并通过在调度器中对函数进行排队来在执行繁重计算时执行其他函数特别有用。

一些浏览器(IE和Edge)实现了setImmediate() 方法,该方法具有相同的功能,但它不是标准的,在其他浏览器上不可用。但这是Node.js中的一个标准函数。

在chrome 浏览中,测试下:

Node.js 事件循环和事件派发器

4、setInterval()

setInterval是一个类似于setTimeout的函数,但不同之处在于:它不会运行回调函数一次,而是将以您指定的特定时间间隔(以毫秒为单位)永远运行回调函数:

setInterval(() => {
// runs every 2 seconds
}, 2000);

上面的函数每2秒运行一次,除非您告诉它停止,否则使用clearInterval将setInterval返回的interval id传递给它:

const id = setInterval(() => {
// runs every 2 seconds
}, 2000);
clearInterval(id);

通常在setInterval回调函数内部调用clearInterval,让它自动决定是应该再次运行还是停止。

5、递归setTimeout

setInterval每n毫秒启动一个函数,而不考虑函数何时完成执行。

如果一个函数总是花费相同的时间,那么一切都很好:

Node.js 事件循环和事件派发器

根据网络条件的不同,该函数可能需要不同的执行时间,例如:

Node.js 事件循环和事件派发器

也许一个长的执行与下一个重叠:

Node.js 事件循环和事件派发器

为了避免这种情况,您可以安排在回调函数完成时调用递归setTimeout:

const myFunction = () => {
// do something
	setTimeout(myFunction, 1000);
};
setTimeout(myFunction, 1000);

为了实现这种情况:

Node.js 事件循环和事件派发器

setTimeout和setInterval在Node.js中通过Timers模块提供

Node.js还提供了setImmediate(),相当于使用setTimeout(()=>{},0),主要用于处理Node.js事件循环。

6、setImmediate()

当您想异步执行某段代码,但要尽快执行时,一种选择是使用Node.js提供的setImmediate()函数:

setImmediate(() => {
// run something
});

作为setImmediate() 参数传递的任何函数都是在事件循环的下一次迭代中执行的回调。

setImmediate() 与setTimeout(() => { }, 0)(传递0ms超时)以及process.nextTick() 和Promise.then() 有何不同?

传递给process.nextTick() 的函数将在当前操作结束后,在事件循环的当前迭代中执行。这意味着它将始终在setTimeout和setImmediate之前执行。

延迟0ms的setTimeout() 回调与setImmediate() 非常相似。执行顺序将取决于各种因素,但它们都将在事件循环的下一次迭代中运行。

process.nextTick回调被添加到process.nextTick队列中。Promise.then() 回调被添加到promises微任务队列中。将setTimeout、setImmediate回调添加到宏任务队列中。

事件循环先执行process.nextTick队列中的任务,然后执行promise微任务队列,然后执行宏任务队列

以下是一个示例,用于显示setImmediate() 、process.nextTick() 和Promise.then() 之间的顺序:

const baz = () => console.log('baz');
const foo = () => console.log('foo');
const zoo = () => console.log('zoo');
const start = () => {
  console.log('start');
  setImmediate(baz);
  new Promise((resolve, reject) => {
    resolve('bar');
  }).then((resolve) => {
    console.log(resolve);
    process.nextTick(zoo);
  });
  process.nextTick(foo);
};
start();

// start foo bar zoo baz

7、Node.js 事件派发器

如何在Node.js中使用自定义事件

如果你在浏览器中使用JavaScript,你就会知道用户的大部分交互是通过事件来处理的:鼠标点击、键盘按钮按下、对鼠标移动的反应等等。

在后端,Node.js为我们提供了使用事件模块构建类似系统的选项。

这个模块特别提供了EventEmitter类,我们将使用它来处理我们的事件。

初始化使用:

const EventEmitter = require('events');
const eventEmitter = new EventEmitter();

该对象公开了on和emit方法以及其他许多方法。

  • emit 用于触发事件
  • on 用于添加一个回调函数,该函数将在事件被触发时执行

例如,让我们创建一个start事件,作为提供一个示例,我们只需看控制台的输出:

eventEmitter.on('start', () => {
	console.log('started');
});

我们运行:

eventEmitter.emit('start');

您可以将参数作为附加参数传递给emit(),从而将参数传递给事件处理程序

eventEmitter.on('start', (start, end) => {
	console.log(`started from ${start} to ${end}`);
});
eventEmitter.emit('start', 1, 100);

EventEmitter对象还公开了其他几种与事件交互的方法,如

  • once() :添加一次性侦听器
  • removeLister() / of() :从事件中删除事件侦听器
  • removeAllListeners() :删除事件的所有侦听器

您可以在官方文档中阅读更多关于这些方法的信息。

https://nodejs.dev/en/api/events/文章来源地址https://www.toymoban.com/news/detail-457509.html

到了这里,关于Node.js 事件循环和事件派发器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象

    process对象是一个全局对象,提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 process 对象是 EventEmitter 类的实例,因此可以使用事件的方式来处理和监听 process 对象的各种事件。以下是一些常用的 process 对象事件: ‘exit’:当进程即将退出时触发。可

    2024年02月05日
    浏览(35)
  • js事件循环详解

    JavaScript的事件循环是一种处理异步事件和回调函数的机制,它是在浏览器或Node.js环境中运行,用于管理任务队列和调用栈,以及在适当的时候执行回调函数。 事件循环的基本原理是,JavaScript引擎在空闲时等待事件的到来,然后将事件添加到事件队列中。事件循环会不断地检

    2024年02月07日
    浏览(37)
  • 33、js - 事件循环 微任务 宏任务

    js是 单线程语言 ,也就是某一刻只能执行一行代码,为了让耗时代码不阻塞其他代码运行,设计了 事件循环模型 。 事件循环是一个并发模型,负责执行代码、收集异步任务的模型,在调用栈空闲,反复调用任务队列里回调函数的执行机制,就叫事件循环。 这个模型与其他

    2024年02月08日
    浏览(37)
  • JS引擎中的线程,事件循环,上下文

      线程 浏览器中有哪些进程呢? 1.浏览器进程:浏览器的主进程,负责浏览器的界面界面显示,与用户交互,网址栏输入、前进、后退,以及页面的创建和销毁。 2.渲染进程(浏览器内核):默认一个tab页面一个渲染进程,主要的作用为页面渲染,脚本执行,事件处理等。 3.

    2024年02月08日
    浏览(91)
  • 一文带你彻底弄懂js事件循环(Event Loop)

    JavaScript事件循环是JavaScript运行时环境中处理异步操作的机制。它允许JavaScript在执行同步代码的同时处理异步任务,以避免阻塞线程并提供更好的用户体验。 本文将在浏览器异步执行原理基础上带你彻底弄懂js的事件循环机制。 js是单线程的,也就是说同一时刻只能做一件事

    2024年02月08日
    浏览(51)
  • Node.js 中的事件驱动编程:构建强大应用程序的利器

    引言: 在当今高度并发的网络环境下,构建高效、响应迅速的应用程序是开发人员的一项重要任务。Node.js,作为一种基于事件驱动编程模型的 JavaScript 运行环境,为开发人员提供了一个强大的工具。本文将介绍 Node.js 中的事件模型以及如何使用事件驱动编程模式构建强大的

    2024年02月10日
    浏览(54)
  • 介绍js各种事件

    目录 一、点击事件 二、鼠标移动事件 三、键盘事件 四、滚轮事件 五、拖放事件 六、窗口大小改变事件 一、点击事件 点击事件是指当用户单击页面上的某个元素时触发的事件。这是最常见和基础的事件之一,也是Web应用程序中最常用的交互之一。 以下是如何使用JavaScrip

    2024年02月11日
    浏览(39)
  • 详细介绍 Node.js

    目录 Node.js 是什么 Node.js 能做什么 Node.js 的特点 Node.js 的组成 1) V8 引擎 2) 本地模块 3) 标准库 总结 Node.js 不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node.js 是一个 JavaScript 运行时 (Runtim

    2024年02月08日
    浏览(60)
  • Node.js 介绍

    Node.js 是一个基于 Chrome V8 JavaScript 引擎构建的开源、跨平台的 JavaScript 运行时环境。它允许开发者使用 JavaScript 来编写服务器端和命令行工具等应用程序。 Node.js 的特点和优势包括: 事件驱动和非阻塞 I/O 模型:Node.js 使用事件驱动的方式处理请求和执行操作,使得能够高效

    2024年02月12日
    浏览(44)
  • Node.js介绍

    Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎任何类型的项目的流行工具!

    2024年04月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包