Trong bài trước chúng ta đã sử dụng các hàm đồng bộ hoá để ghi và đọc file, tuy nhiên các này không tối ưu do có thể làm block main thread. Trong bài này chúng ta sẽ cùng nhau sử dụng hàm bất đồng bộ để ghi và đọc file nhé.
Tạo và ghi một tập tin
Chúng ta có thể tạo và ghi một tập tin theo kiểu bất đồng bộ với mã nguồn như sau:
const fs = require('fs');
const text = 'Hello Techmaster';
fs.mkdir("files", (mkdirError) => {
if (mkdirError) {
if (mkdirError.code == "EEXIST") {
console.log("Folder existed");
} else {
return console.error("create files directory error", mkdirError);
}
} else {
console.log("Created files directory");
}
fs.writeFile("files/techmaster.txt", text, function (writeFileError) {
if (writeFileError) {
console.log("write file error", writeFileError);
} else {
console.log("Write file done.");
fs.readFile("files/techmaster.txt", function (readFileError, data) {
if (readFileError) {
console.error("read file error", readFileError);
} else {
console.log("File data:", data.toString())
}
});
}
});
});
Trong đoạn mã này chúng ta có:
- Tạo ra một đối tượng fs đại diện cho module fs, một module core của NodeJS.
- Tạo ra một thư mục có tên files nếu có lỗi thì kiểm tra xem mã lỗi có phải là thư mục đã tồn tại không, nếu là mã lỗi đã tồn tại thì in ra log, nếu lỗi khác thì hiển thị lỗi và dừng hàm callback.
- Nếu không có lỗi hoặc thư mục files đã tồn tại thì ghi dữ liệu vào tập tin “files/techmaster.txt”.
- Sau khi file xong thì đọc file.
Chúng ta có thể chạy chương trình bằng lệnh node main.js và thấy kết quả là:
Created files directory
Write file done.
File data: Hello Techmaster
Nếu chưa tồn tại thư mục files, hoặc:
Folder existed
Write file done.
File data: Hello Techmaster
Nếu đã tồn tại thư mục files.
Sử dụng async/await
Như bạn thấy ở trên, việc sử dụng các hàm callback lồng nhau khiến mã nguồn trở nên rất rối và không clean code nữa. Để khắc phục vấn đề này chúng ta có thể sử dụng async/await để làm phẳng mã nguồn như sau:
const fs = require('fs');
const text = 'Hello Techmaster';
async function doMkDir() {
return new Promise((resolve, reject) => {
fs.mkdir("files", (mkdirError) => {
if (mkdirError) {
if (mkdirError.code == "EEXIST") {
console.log("Folder existed");
} else {
reject("create files directory error: " + mkdirError);
}
} else {
console.log("Created files directory");
}
resolve();
});
});
}
async function doWriteFile() {
return new Promise((resolve, reject) => {
fs.writeFile("files/techmaster.txt", text, function (writeFileError) {
if (writeFileError) {
reject("write file error + " + writeFileError);
} else {
resolve();
}
});
});
}
async function doReadFile() {
return new Promise((resolve, reject) => {
fs.readFile("files/techmaster.txt", function (readFileError, data) {
if (readFileError) {
reject("read file error: " + readFileError);
} else {
resolve(data.toString());
}
});
});
}
async function main() {
await doMkDir();
await doWriteFile();
console.log("Write file done.");
const fileData = await doReadFile();
console.log("File data:", fileData)
}
main();
Sử dụng kiểu async/await có làm mã nguồn của chúng ta dài ra thêm 1 chút, tuy nhiên khi sử dụng lại dễ theo dõi hơn rất nhiều. Khi chúng ta thực thi chương trình, kết quả vẫn sẽ là:
Folder existed
Write file done.
File data: Hello Techmaster
Ưu điểm
Nếu bỏ qua việc phải code quá nhiều thì phương pháp đọc ghi tập tin ở dạng bất đồng bộ này được khuyến khích sử dụng. Ưu điểm của nó là không làm block luồng main từ đó nhả tài nguyên cho các công việc khác được thực hiện và đảm bảo hiệu năng của toàn bộ server. Tất nhiên ở phần phía dưới được cài đặt bằng C/C++ thì những người viết node core đã phải làm những công việc phức tạp liên quan đến xử lý I/O thread, queue, main thread mà chúng ta sẽ tìm hiểu sâu hơn vào kiến trúc phần mềm của NodeJS ở những bài sau nhé.
Tổng kết
Như vậy chúng ta đã cùng nhau ghi và đọc một tập tin với NodeJS theo kiểu bất đồng bộ.
Cám ơn bạn đã quan tâm đến bài viết|video này. Để nhận được thêm các kiến thức bổ ích bạn có thể:
- Đọc các bài viết của TechMaster trên facebook: https://www.facebook.com/techmastervn
- Xem các video của TechMaster qua Youtube: https://www.youtube.com/@TechMasterVietnam nếu bạn thấy video/bài viết hay bạn có thể theo dõi kênh của TechMaster để nhận được thông báo về các video mới nhất nhé.
- Chat với techmaster qua Discord: https://discord.gg/yQjRTFXb7a
Bình luận