Menu
CoddyTech

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.

challenge icon

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.

  1. count.js đã in ra Reading... và biết cần đọc tệp nào: file là từ được nhập sau node count.js, hoặc là notes.json nếu bạn không nhập gì.
  2. Đọc tệp đó bằng fs.readFile và một callback. Mọi việc dưới đây diễn ra bên trong callback.
  3. 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.json bắt đầu với hai ghi chú, vì vậy bạn in ra 2 notes.
  4. Nếu đọc thất bại, nghĩa là lỗi của callback không phải là null, hãy in ra Cannot read theo sau là tên tệp thay vì số lượng.
  5. Trong cả hai trường hợp, hãy in ra Done sau cùng, cũng từ bên trong callback.

node count.js in ra:

Reading...
2 notes
Done

node count.js nothere.json in ra:

Reading...
Cannot read nothere.json
Done

Thử 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.
quiz iconTự kiểm tra

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

Tự luyện tập: Playground Express