Tìm hiểu Callback trong NodeJS
Trong bài viết này mình sẽ giới thiệu về khái niệm callback trong Nodejs, đồng thời chúng ta sẽ cùng nhau đi tìm hiểu về ứng dụng của callback trong dự án NodeJS thực tế như thế nào? Đây cũng là một phần khá quan trọng khi chúng ta lập trình với NodeJS.
NodeJS có khả năng xử lý đồng thời rất nhiều tác vụ đồng thời và thời gian phản hồi nhanh, mọi hàm trong NodeJS là bất đồng bộ (asynchronous) do đó mọi tác vụ được xử lý ở chế độ nền (background processing) và NodeJS cũng cung cấp cho chúng ta callback function để nhận kết quả khi hoàn tất.
1. Callback trong NodeJS là gì ?
Khái niệm về callback trong NodeJS cũng tương tự như khái niệm về [callback trong javascript] vì NodeJS sử dụng Google V8 JavaScript engine để thực thi mã và phần lớn các module được viết bằng javascript. Các bạn có thể hiểu đơn giản rằng callback function được gọi khi đã hoàn thành một tác vụ cụ thể nào đó.
Tất cả các API mà NodeJS cung cấp đều được hỗ trợ callback, từ đó giúp NodeJS có khả năng mở rộng cao hơn. Đến đây các bạn chắc cũng hơi mơ hồ, mình sẽ đưa ra một tình huống thực tế nhé !
Bài viết này được đăng tại [free tuts .net]
Bạn gọi điện hẹn cô gái đi chơi, cô ta đang bận và sẽ trả lời bạn trong 30 phút nữa , trong thơi gian 30 phút đó bạn có thể đi tắm hay làm bất cứ gì khác và không cần bận tâm gì đén cô gái. Cho đến khi bạn nhận lại được cuộc gọi của cô gái (callback). Môt ví dụ khá đơn giản nhưng có lẽ với nó bạn cũng đã hình dung cách mà callback function trong NodeJS hoạt động ra sao ?
2. Một số vị dụ về Callback trong NodeJS
Chúng ta sẽ cùng nhau tìm hiểu về các API của NodeJS hỗ trợ callback thông qua ví dụ kinh điển về đọc file trong NodeJS, trong module FS trong NodeJS cung cấp cho chúng ta rất nhiều API hữu ích như readFileSync(), readFile(),writeFile(), writeFileSync()... cho phép chúng ta làm việc với một file.
Blocking trong NodeJS
Như đã đề cập đến ở trên NodeJS cung cấp cho chúng ta các API trong quá trình làm việc, hàm readFileSync() trong module FS của NodeJS là một hàm đồng bộ (synchronous) và nó sẽ chặn các tác vụ tiếp theo cho đến khi nó đã được hoàn thành.
Trước tiên chúng ta sẽ tạo file freetuts.txt
có nội dung như sau :
Freetuts.net - Lập trình ReactJS căn bản
Tiếp theo, tạo file blocking.js
có đoạn code sau:
//Khai báo thư viện FS của NodeJS const fs = require('fs') //Đọc file bằng hàm readfileSync const filedata = fs.readFileSync('freetuts.txt') //In ra nội dung của file console.log(filedata.toString()); //In ra dòng kết thúc chương trình console.log('Kết thúc chương trình')
Tiến hành chạy file bằng cách mở [terminal] và chạy dòng lệnh :
node blocking.js
Chúng ta sẽ nhận được kết quả như hình :
Ta nhận thấy khi sử dụng các hàm đồng bộ (synchronous) chương trình sẽ chạy câu lệnh theo thứ tự từ trên xuống dưới, khi chạy đến hàm readfileSync() chương trình sẽ đợi nó hoàn thành thì mới thực vụ các tác vụ tiếp theo. Đây được gọi là khái niệm blocking trong lập trình NodeJS
Non-Blocking trong NodeJS
Non-blocking thực hiện ngược lại với blocking mà mình đã nhắc đến ở trên, sử dụng các hàm bất đồng bộ (asynchronous) và khái niệm về callback thể hiện rõ nhất trong ví dụ ở phần này. Mình sẽ sử dụng hàm readFile() trong module FS của NodeJS để minh họa ví dụ cho bạn nhé !
Chúng ta sẽ tạo một file có nên freetuts.txt
có nội dung
Xin chào bạn đến với Freetuts.net
Tiếp theo, tao file nonblocking.js
có đoạn code sau:
//Khai báo thư viện FS của NodeJS const fs = require('fs') //Callback Function const callbackReadFile = function (err, filedata) { if (err) return console.error(err); console.log(filedata.toString()); } //Đọc file bằng hàm readFile fs.readFile('freetuts.txt', callbackReadFile); console.log('Kết thúc chương trình')
Tiến hành chạy file bằng cách mở terminal và chạy dòng lệnh :
node nonblocking.js
Chúng ta sẽ nhận được kết quả như hình :
Câu lệnh console.log('Kết thúc chương trình')
được khai báo sau hàm đọc file tại sao lại in ra đầu tiên ? Đến đây bạn chắc hẳn cũng thắc mắc về điều đó ? Vì hàm readFile là một hàm bất đồng bộ (asynchronous) và trả về một callback là function callbackReadFile
. callbackReadFile
sẽ được gọi khi chương trình đọc file xong.
Nó được gọi là một callback function nhận giá trị của hàm bất đồng bộ trả về khi nó hoàn thành. Trong chương trình này hàm fs.readfile() có thời gian hoàn thành tác vụ lâu hơn hàm console.log() nên nó sẽ được hoàn thành sau và trả về một callback function.
Bạn có thể thấy với hai ví dụ trên đã giải thích khá rõ về [blocking] và [none-blocking], ở ví dụ đầu tiên các tác vụ đợi nhau hoàn thành còn ví dụ thứ 2 hoàn toàn ngược lại. Nó không đợi các tác vụ hoàn thành rồi mới thực thi câu lệnh tiếp theo mà đợi callback function.
Ví dụ thứ hai cũng là đại diện rõ nhất về callback trong NodeJS. Mong rằng bài viết sẽ giúp bạn tìm hiểu rõ hơn về khái niệm này trong lập trình NodeJS.