0.为什么使用异步
因为js本身是单线程,如果所有的任务都是同步的,那么一些非常耗时的任务就会严重影响到用户体验
1. 回调函数
| const fs = require('fs'); |
| |
| function read(fileName) { |
| fs.readFile(fileName, 'utf-8', (err, data) => { |
| if (err) { |
| console.log('err', err); |
| throw new Error('文件读取出错'); |
| } else { |
| console.log('data', data); |
| } |
| }); |
| } |
| try { |
| |
| read('./test1.txt'); |
| |
| } catch (error) { |
| console.log('err', error); |
| } |
缺点:
- 无法捕获异常,无法return返回读取结果
- 会造成
回调地狱
- 效率低
- 如果使用 runcode运行代码则需要使用 __dirname 拼接上文件名
解决
| const evnEmiter = require('events'); |
| const dataObj = {}; |
| const eve = new evnEmiter(); |
| eve.on('ready', (key, value) => { |
| dataObj[key] = value; |
| if (Object.keys(dataObj).length === 2) { |
| console.log('数据获取成功', dataObj); |
| } |
| }); |
| fs.readFile(__dirname + '/test.txt', 'utf-8', (err, data) => { |
| if (err) { |
| console.log('err', err); |
| throw new Error('文件读取出错'); |
| } else { |
| eve.emit('ready', 'data1', data); |
| } |
| }); |
| fs.readFile(__dirname + '/trst1.txt', 'utf-8', (err, data) => { |
| if (err) { |
| console.log('err', err); |
| throw new Error('文件读取出错'); |
| } else { |
| eve.emit('ready', 'data2', data); |
| } |
| |
| const dataObj1 = {}; |
| function done(key, value) { |
| dataObj1[key] = value; |
| if (Object.keys(dataObj1).length === 2) { |
| console.log('数据获取成功1', dataObj1); |
| } |
| } |
| |
| fs.readFile(__dirname + '/test.txt', 'utf-8', (err, data) => { |
| if (err) { |
| console.log('err', err); |
| throw new Error('文件读取出错'); |
| } else { |
| done('data1', data); |
| } |
| }); |
| fs.readFile(__dirname + '/trst1.txt', 'utf-8', (err, data) => { |
| if (err) { |
| console.log('err', err); |
| throw new Error('文件读取出错'); |
| } else { |
| done('data2', data); |
| } |
| }); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?