千家信息网

Node.js中的异步编程的示例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,Node.js中的异步编程的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。异步编程概述曾经的单线程模型在同步I/O的影响下,由于
千家信息网最后更新 2026年11月02日Node.js中的异步编程的示例分析

Node.js中的异步编程的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

异步编程概述

曾经的单线程模型在同步I/O的影响下,由于I/O调用缓慢,在应用层面导致CPU与I/O无法重叠进行。为了照顾编程人员的阅读思维习惯,同步I/O盛行了很多年。

但是有很大的性能问题!

Node利用JavaScript及其内部异步库,将异步直接提升到业务层面。Node带来的最大特性莫过于基于事件驱动的非阻塞I/O模型。非阻塞I/O可以使CPU与I/O并不相互依赖等待,让资源得到更好的利用。

异步编程解决方案

目的:读取package.json 中main 字段对应的文件内容

Callback

使用回调函数进行异步I/O的操作

const fs = require("fs");fs.readFile("./package.json", { encoding: "utf-8" }, (err, data) => {  if (err) throw err;  const { main } = JSON.parse(data);  fs.readFile(main, { encoding: "utf-8" }, (err, data) => {    if (err) throw err;    console.log(data);  });});复制代码

问题:如何解决回调地狱?

Promise

Promise是一个具有四个状态的有限状态机,其中三个核心状态为Pending(挂起),Fulfilled( 完成)、Rejected(拒绝),以及还有一个未开始状态

详细内容可以看我之前的博文 Promise初探

使用Promise,实现读取 package.json 中 main 字段对应的文件内容

const { readFile } = require("fs/promises");readFile("./package.json", { encoding: "utf-8" })  .then((res) => {    return JSON.parse(res);  })  .then((data) => {    return readFile(data.main, { encoding: "utf-8" });  })  .then((res) => {    console.log(res);  });复制代码

对比之前用Callback的解决方案,可以看出没有嵌套的回调了,通过一系列的链式调用来处理异步操作。

Callback 转为 Promise

如何将 Callback 转为 Promise 形式?

可以使用Node自带的工具函数 util.promisify

可以自己实现一下:

function promisify(fn, receiver) {  return (...args) => {    return new Promise((resolve, reject) => {      fn.apply(receiver, [        ...args,        (err, res) => {          return err ? reject(err) : resolve(res);        },      ]);    });  };}const readFilePromise = promisify(fs.readFile, fs);复制代码

await

await 函数使用 try catch 捕获异常(注意并行处理)

const { readFile } = require("fs/promises");const start = async () => {  const { main } = JSON.parse(    await readFile("./package.json", { encoding: "utf-8" })  );  const data = await readFile(main, { encoding: "utf-8" });  console.log(data);};start();复制代码

await的语法写起来就像同步编程一样,这里的操作是串行操作,会一行一行的等待执行。

如果几个任务是可以并行的,这样写就不太好了。这是,我们可以使用Promise.all来操作并行的任务

这里也会有个小问题,我课后问老师了,这是老师的解答

【问】在异步那块,说到串行和并行,在并行处理那块我有一个疑问。如果并行的场景要求:不管其他任务执行成功还是失败,每个异步任务都要执行完,最后统一处理错误,那在用Promise.all来处理多个异步任务时候,遇到第一个任务执行错误的时候就会返回,如何操作才能让所有任务都执行完成,再统一处理错误呢

【答】Promise.all 处理多个请求,当所有请求都成功的时候,resolve 一个数组回来,里面是执行结果。如果有一个请求失败就立刻 reject 那个错误来,所以这个地方我们不能使用 Promise.all 来实现。Promise 有一个 allSettled 方法,developer.mozilla.org/en-US/docs/…

Event

发布订阅模式,Node.js 内置events 模块

比如HTTP server on('request') 事件监听

const EventEmitter = require("events");class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();myEmitter.on("event", () => {  console.log("an event occurred!");});myEmitter.emit("event");const http = require("http");const server = http.createServer((req, res) => {  res.end("hello!!! this is YK!!!");});server.on("request", (req, res) => {  console.log(req.url);});server.listen(3000);复制代码


看完上述内容,你们掌握Node.js中的异步编程的示例分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

任务 处理 编程 utf-8 代码 内容 问题 状态 错误 函数 方法 时候 同步 示例 分析 成功 一行 事件 多个 字段 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司 互联网是第几次科技革命的成果 北京路客互联网科技有限公司 科技互联网项目 互联网核心科技是什么 北京互联网科技有限公司 科技创新互联网企业 万达互联网科技 深圳卡尔迅互联网科技有限公司怎么样 广西拼得多互联网科技有限公司 华服互联网科技官网 广州恒生互联网科技有限 宁夏众和广鑫互联网科技有限公司 青海科技产业互联网发展 中国互联网公司排名锤子科技 互联网科技大赛获奖感言 浙南科技城互联网大厦招聘 互联网科技接地气 广西泛欧互联网科技有限公司 山东亿川互联网科技有限责任公司 互联网科技公司 广州大一互联网络科技有限公司 互联网 的科技创新 互联网女皇 腾讯科技 互联网科技股午盘股票涨跌 世界互联网科技公司市值排名 民营互联网公司国防科技 互联网科技的全部知识 深圳艾果互联网通讯科技 科技大学互联网
0