回调
本课属于 Coddy Node.js 学习旅程的“Node.js 基础”单元。第 18 课,共 33 课。
读取大文件需要时间,等待文件读取的程序在这期间什么也做不了。
fs.readFile(path, 'utf8', callback) 会启动读取,并立即返回。文件加载完成后,Node 会用 (err, text) 调用你的回调函数。成功时,err 为 null,否则它会包含一个错误,所以要先检查它。所有需要用到文本的操作都要放在回调函数中。
import fs from 'node:fs';
fs.readFile('poem.txt', 'utf8', (err, text) => {
if (err) {
console.log('No poem today');
return;
}
console.log(text.split('\n').length + ' lines');
});
console.log('Asked for the poem');Asked for the poem 会先打印出来:readFile 后面的语句会在文件仍在加载时运行。
挑战
简单本课会在 count.js 中开启一个全新的回调计数示例,而不是使用你在“处理错误”中编写的笔记工具文件。提供的 notes.json、notes.js 和 store.js 也包含在内;你之前的成果仍保存在对应的课中。
读取大文件需要时间。使用回调时,Node 可以同时处理其他工作,并在文件准备好后调用你的代码。你将在一个单独的小程序 count.js 中练习这一点,它会统计文件中的笔记数量。
count.js已经会输出Reading...,也知道要读取哪个文件:file是在node count.js后输入的单词;如果没有输入任何内容,则使用notes.json。- 使用
fs.readFile和回调读取该文件。下面的所有操作都在回调中进行。 - 如果读取成功,就用
JSON.parse将文本转换为数组。输出数组中有多少条笔记,后面跟着notes。统计数组中的笔记数量,而不是文件的行数。notes.json中有两条笔记,所以输出2 notes。 - 如果读取失败,也就是说回调的错误不为
null,就输出Cannot read,后面跟着文件名,而不是笔记数量。 - 无论哪种情况,都要在最后输出
Done,同样要在回调中输出。
node count.js 会输出:
Reading...
2 notes
Donenode count.js nothere.json 会输出:
Reading...
Cannot read nothere.json
Done试试看:本课会运行 count.js,因此终端会显示 $ node count.js。留空输入框并按“运行”,程序就会读取 notes.json。然后在输入框中输入 nothere.json 并按 Enter,尝试读取一个不存在的文件。
亲手试试
import fs from 'node:fs';
const file = process.argv[2] ?? 'notes.json';
console.log('Reading...');
// 用 fs.readFile 和回调函数读取文件。
// 输出笔记的数量,然后输出 Done。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
Node.js 基础中的所有课
自己练习: Express 在线编辑器