29 # node 中的 eventloop

简介: 29 # node 中的 eventloop

process.cwd

cwd:current working directory 表示当前用户的工作目录(这个目录可以更改用户自己切换即可)

当用户在哪执行 node 命令,就去哪找配置文件

console.log(process.cwd());

__dirname:表示当前文件所在的目录,这个目录是不能手动修改的,它不是 global 上的属性,是每个模块都会传入的属性

process.env

env:环境变量,可以根据环境变量实现不同的功能,比如:

let domain = process.env.NODE_ENV === "production" ? "localhost" : "https://blog.csdn.net/kaimo313";

设置临时的环境变量:

  • windows:set key=value
  • mac:export key=value

我的系统是 windows 的,下面我用 set key=value 试一下

先在 cmd 里设置临时的环境变量,set kaimo=313,然后执行 node env.js,输出是有 313 的值

set kaimo=313

然后你打开 powershell 执行 node env.js 是没有这个值输出

console.log(process.env.kaimo);

node 中的 eventloop

事件循环是 Node.js 处理非阻塞 I/O 操作的机制。

现在浏览器的事件环跟 node 的事件环执行效果是一样的(node 10 版本后)

详细的可以查看文档:https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick

事件循环操作顺序的简化概览图:

从上至下执行分成下面这些阶段,每个框被称为事件循环机制的一个阶段,这些阶段都是一个队列。

  • 定时器(timers):此阶段执行由 setTimeout()setInterval() 排序。
  • 挂起的回调函数(pending callbacks):执行 I/O 回调推迟到下一个循环迭代。【内部机制】
  • idle, prepare:仅在内部使用。【内部机制】
  • 轮询(poll):检索新的 I/O 事件; 执行与 I/O 相关的几乎任何回调(由“计时器”或 “setImmediate()”所设的紧邻回调除外); node 将在适当时机在此处暂停。
  • 检查阶段(check):setImmediate() 回调在此处被调用。
  • 关闭的回调函数(close callbacks):一些关闭的回调函数,如:socket.on('close', ...)

setImmediate vs setTimeout

  • setImmediate() 实际上是一个在事件循环的单独阶段运行的特殊计时器。它使用一个 libuv API 来安排回调在轮询阶段完成后执行。。
  • setTimeout() 在已过期的最小阈值后运行。
setTimeout(() => {
    console.log("setTimeout");
}, 0);
setImmediate(() => {
    console.log("setImmediate");
});

上面代码有时先输出 setTimeout,然后输出 setImmediate,有时先输出 setImmediate,再输出 setTimeout。

按照上面的概览图,应该先走 timers 再到 check 阶段,先输出 setTimeout,然后输出 setImmediate,那为什么会出现有时反过来的情形?

这是因为如果运行不在 I/O 周期(即主模块)内的脚本,则执行两个计时器的顺序是非确定性的,因为它受进程性能的约束。进入事件环时 setTimeout 有可能没有完成。

我们可以试试放在 I/O 周期 里:

// poll -> check -> timers
const fs = require("fs");
fs.readFile("./file/name.txt", "utf-8", (err, data) => {
    if (err) throw err;
    console.log(data);
    setTimeout(() => {
        console.log("setTimeout");
    }, 0);
    setImmediate(() => {
        console.log("setImmediate");
    });
});

这个顺序就是一个确定的 poll -> check -> timers

process.nextTick

node 中自己实现的微任务 process.nextTick / queueMicrotask,宏任务 setImmediate

setTimeout(() => {
    console.log(2);
});
process.nextTick(() => {
    console.log(1);
});
queueMicrotask(() => {
    console.log(3);
});
// 输出 1 3 2

process.nextTick 并不属于事件环的一部分,在本轮代码执行后执行(timers 到 poll 为一轮,如果后有 check 就执行 check )

// nextTick 比 Promise 的 then 要快一些
setTimeout(() => {
    console.log(1);
    Promise.resolve().then(() => {
        console.log("then");
    });
    process.nextTick(() => {
        console.log("nextTick");
    });
}, 0);
setTimeout(() => {
    console.log(2);
}, 0);

目录
相关文章
|
3天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
10561 53
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
9天前
|
人工智能 JavaScript API
解放双手!OpenClaw Agent Browser全攻略(阿里云+本地部署+免费API+网页自动化场景落地)
“让AI聊聊天、写代码不难,难的是让它自己打开网页、填表单、查数据”——2026年,无数OpenClaw用户被这个痛点困扰。参考文章直击核心:当AI只能“纸上谈兵”,无法实际操控浏览器,就永远成不了真正的“数字员工”。而Agent Browser技能的出现,彻底打破了这一壁垒——它给OpenClaw装上“上网的手和眼睛”,让AI能像真人一样打开网页、点击按钮、填写表单、提取数据,24小时不间断完成网页自动化任务。
2384 5
|
23天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
23983 121
|
3天前
|
人工智能 IDE API
2026年国内 Codex 安装教程和使用教程:GPT-5.4 完整指南
Codex已进化为AI编程智能体,不仅能补全代码,更能理解项目、自动重构、执行任务。本文详解国内安装、GPT-5.4接入、cc-switch中转配置及实战开发流程,助你从零掌握“描述需求→AI实现”的新一代工程范式。(239字)
2214 126

热门文章

最新文章