Menu
CoddyTech

Promise

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 21 trên 33.

Các callback lồng nhau rất khó theo dõi, và mỗi callback đều phải nhớ kiểm tra err.

node:fs/promises thay vào đó trả về một promise: một đối tượng đại diện cho kết quả sẽ có sau. .then(fn) chạy với kết quả đó, .catch(fn) chạy nếu bất kỳ bước nào trước đó gặp lỗi, còn .finally(fn) luôn chạy.

import { readFile } from 'node:fs/promises';

readFile('poem.txt', 'utf8')
    .then((text) => console.log(text.length + ' characters'))
    .catch(() => console.log('No poem today'))
    .finally(() => console.log('Bye'));

Lỗi được ném ra bên trong .then cũng sẽ chuyển đến .catch, nên một trình xử lý có thể xử lý cả việc đọc lẫn phân tích dữ liệu. Promise thất bại mà không có .catch sẽ làm chương trình gặp sự cố.

challenge icon

Thử thách

Dễ

Bước này mở dự án công cụ dòng lệnh ghi chú đã chuẩn bị sẵn của khóa học, thay vì các tệp dự án trong Callbacks (bao gồm count.js). Phần bạn đã làm trước đó vẫn nằm trong bài học riêng. Hãy đọc các tệp được cung cấp trước khi chỉnh sửa count.js. Bản sao này có ví dụ đếm ghi chú bất đồng bộ.

  • Viết lại count.js bằng readFile từ node:fs/promises và .then.
  • Giờ đây, khi thiếu tệp, chương trình sẽ in ra No notes yet từ .catch.
  • Done vẫn xuất hiện cuối cùng, từ .finally.

Chạy node count.js, sau đó chạy node count.js nothere.json.

Nếu không có đối số, đầu ra là Reading..., 2 notes, rồi đến Done, mỗi dòng một nội dung. Với nothere.json, dòng ở giữa là No notes yet.

Tự làm thử

import fs from 'node:fs';

const file = process.argv[2] ?? 'notes.json';

console.log('Reading...');
fs.readFile(file, 'utf8', (err, text) => {
    if (err) {
        console.log(`Cannot read ${file}`);
    } else {
        console.log(`${JSON.parse(text).length} notes`);
    }
    console.log('Done');
});

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