Callback
Thuộc phần Kiến thức cơ bản về Node.js trong hành trình Node.js của Coddy. Bài học 18 trên 33.
Đọc một tệp lớn mất thời gian, và chương trình chờ tệp đó sẽ không làm gì khác trong lúc chờ.
fs.readFile(path, 'utf8', callback) bắt đầu đọc rồi trả về ngay. Khi tệp tải xong, Node gọi hàm callback của bạn với (err, text). err là null nếu thành công, nếu không thì là một lỗi, vì vậy hãy kiểm tra nó trước. Mọi thứ cần dùng đến văn bản đều đặt bên trong hàm callback.
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 được in ra trước: dòng lệnh sau readFile chạy trong khi tệp vẫn đang tải.
Thử thách
DễBài học này mở ra một ví dụ mới về đếm bằng callback trong count.js, thay vì các tệp của công cụ ghi chú trong bài Xử lý lỗi. Các tệp notes.json, notes.js và store.js được cung cấp kèm theo; phần bạn đã làm trước đó vẫn được lưu trong bài học riêng.
Đọc một tệp lớn cần thời gian. Với callback, Node có thể làm việc khác trong lúc chờ, rồi gọi lại code của bạn khi tệp đã sẵn sàng. Hãy luyện tập điều này trong một chương trình nhỏ riêng biệt, count.js, để đếm số ghi chú trong một tệp.
count.jsđã in raReading...và biết cần đọc tệp nào:filelà từ được nhập saunode count.js, hoặc lànotes.jsonnếu bạn không nhập gì.- Đọc tệp đó bằng
fs.readFilevà một callback. Mọi việc dưới đây diễn ra bên trong callback. - Nếu đọc thành công, hãy chuyển văn bản thành mảng bằng
JSON.parse. In ra số ghi chú trong mảng, theo sau lànotes. Hãy đếm số ghi chú trong mảng, không phải số dòng trong tệp.notes.jsonbắt đầu với hai ghi chú, vì vậy bạn in ra2 notes. - Nếu đọc thất bại, nghĩa là lỗi của callback không phải là
null, hãy in raCannot readtheo sau là tên tệp thay vì số lượng. - Trong cả hai trường hợp, hãy in ra
Donesau cùng, cũng từ bên trong callback.
node count.js in ra:
Reading...
2 notes
Donenode count.js nothere.json in ra:
Reading...
Cannot read nothere.json
DoneThử ngay: bài học này chạy count.js, vì vậy terminal hiển thị $ node count.js. Nhấn Chạy khi ô nhập đang để trống, chương trình sẽ đọc notes.json. Sau đó nhập nothere.json vào ô rồi nhấn Enter để đọc một tệp không tồn tại.
Tự làm thử
import fs from 'node:fs';
const file = process.argv[2] ?? 'notes.json';
console.log('Reading...');
// Đọc tệp (file) bằng fs.readFile và một callback.
// In ra số lượng ghi chú, rồi in ra Done.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức cơ bản về Node.js
1Chạy JavaScript trên Node
Xin chào, NodeĐọc lệnhĐối số dòng lệnhCác lệnhTự luyện tập: Playground Express