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ố.
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.jsbằngreadFiletừnode:fs/promisesvà.then. - Giờ đây, khi thiếu tệp, chương trình sẽ in ra
No notes yettừ.catch. Donevẫ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
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