fs 文件操作模块
Node 只在文件 IO 操作中,提供了同步调用和异步调用两种形式,fs 模块对文件的几乎所有操作都有同步和异步两种形式,两者可以结合使用,但是推荐能使用异步调用解决问题的情况下,少用同步调用。
例如:readFile()
和 readFileSync()
。
引入包
|
|
同步操作
- 同步代码会阻塞后续代码执行,效率低
- 同步 API 需要 try-catch 捕获异常
- 同步 API 优点代码符合思维逻辑,
- 按顺序执行,简单执行
|
|
同步读取文件的一个例子
|
|
异步操作
异步 API 往往伴随着一个回调函数用来接收,返回值或异常处理。
回调函数的参数中第一个参数一般都是一个 err 对象,用来判定异步 API 是否发生异常。
- 异步 API 即便没有捕获异常也不会主动抛出异常
- 异步 API,无法通过 try-catch 捕获异常
一般文件操作中,所有的异步 API,都会在回调函数中提供一个 error 对象
- 如果操作过程中有异常,则 error 是一个异常对象
- 如果操作成功,没有问题,则 error 是一个 null
- 所以,为了判定是否有异常,if (err) {// 处理异常}
|
|
异步操作中:
- 开发阶段,使用 throw err 的形式抛出异常
- 目的是为了快速的定位代码的错误
- 如果是网站服务器中,这个就不会去 throw err,
- 一般会有异常处理机制
- 一般在生产环境,会处理异常,例如记录日志方便排查错误
- throw err 会直接抛出异常,退出进程
一个例子
|
|
封装准备器材的这个过程;
|
|
修改封装中的异常处理方式
|
|
封装多个异步并行任务
找多个人区做准备工作
|
|
将上面代码继续封装
|
|
以上封装的问题,ready 的过程可能失败,应该告诉做事的,而不是主动抛出来;怎么告诉呢?传给回调函数,于是封装成了下面代码:
|
|
歌词在控制台一行一行打印 lrc
|
|
- 同步调用立即执行,会阻塞后续代码继续执行,如果想要捕获异常需要使用
try-catch
- 异步调用不会阻塞后续代码继续执行,需要回调函数作为额外的参数,通常包含一个错误作为回调函数的第一个参数
- 异步调用通过判断第一个err对象来处理异常
- 异步调用结果往往通过回调函数来进行获取
复制文件
|
|
process
process.argv 可以获取当前通过执行脚本的时候传递的参数,默认结果是一个数组
- 数组中第 0 项就是 node 的可执行文件的绝对路径
- 数组中第 1 项就是 执行的当前脚本文件的绝对路径
- 数组中从第 2 项开始,就是用户通过执行命令传递进来的参数选项,以空格划分
|
|
封装复制文件函数
|
|