Menu
CoddyTech

回调

本课属于 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 后面的语句会在文件仍在加载时运行。

challenge icon

挑战

简单

本课会在 count.js 中开启一个全新的回调计数示例,而不是使用你在“处理错误”中编写的笔记工具文件。提供的 notes.json、notes.js 和 store.js 也包含在内;你之前的成果仍保存在对应的课中。

读取大文件需要时间。使用回调时,Node 可以同时处理其他工作,并在文件准备好后调用你的代码。你将在一个单独的小程序 count.js 中练习这一点,它会统计文件中的笔记数量。

  1. count.js 已经会输出 Reading...,也知道要读取哪个文件:file 是在 node count.js 后输入的单词;如果没有输入任何内容,则使用 notes.json。
  2. 使用 fs.readFile 和回调读取该文件。下面的所有操作都在回调中进行。
  3. 如果读取成功,就用 JSON.parse 将文本转换为数组。输出数组中有多少条笔记,后面跟着 notes。统计数组中的笔记数量,而不是文件的行数。notes.json 中有两条笔记,所以输出 2 notes。
  4. 如果读取失败,也就是说回调的错误不为 null,就输出 Cannot read ,后面跟着文件名,而不是笔记数量。
  5. 无论哪种情况,都要在最后输出 Done,同样要在回调中输出。

node count.js 会输出:

Reading...
2 notes
Done

node 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。
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

Node.js 基础中的所有课

自己练习: Express 在线编辑器