CĂN BẢN
SERVER
MYSQL
MONGODB
MODULE
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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é !

callback trong nodejs

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 :

tim hieu ve callback func trong nodejs

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 :

none blocking trong nodejs

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.

đượ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.

Cùng chuyên mục:

Crawl dữ liệu website bằng NodeJS cơ bản

Crawl dữ liệu website bằng NodeJS cơ bản

CORS là gì ? Xử lý CORS trong NodeJS

CORS là gì ? Xử lý CORS trong NodeJS

Chắc hẳn trong quá trình xử lý các request tới server thì một vài trường…

Xử lý form trong Express

Xử lý form trong Express

Xây dựng URL trong Express

Xây dựng URL trong Express

Trong bài viết này chúng ta sẽ cùng nhau đi tìm hiểu về cách xây…

Populate trong Mongoose

Populate trong Mongoose

Error Handling & Debugging trong Socket.io

Error Handling & Debugging trong Socket.io

Namespaces & Rooms trong Socket.io

Namespaces & Rooms trong Socket.io

Middleware trong Mongoose

Middleware trong Mongoose

Create / Read / Update / Delete trong Mongoose

Create / Read / Update / Delete trong Mongoose

Validation trong Mongoose

Validation trong Mongoose

Subdocuments trong Mongooose

Subdocuments trong Mongooose

Documents trong Mongoose

Documents trong Mongoose

Trong bài viết này chúng ta sẽ tìm hiểu về documents trong Mongoose

Models trong Mongoose

Models trong Mongoose

SchemaTypes trong Mongoose

SchemaTypes trong Mongoose

Schemas trong Mongoose

Schemas trong Mongoose

Mongoose trong NodeJS

Mongoose trong NodeJS

Làm việc với Table MySQL sử dụng Nodejs

Làm việc với Table MySQL sử dụng Nodejs

Kết nối với MongoDB trong NodeJS

Kết nối với MongoDB trong NodeJS

Giới thiệu MongoDB trong NodeJS

Giới thiệu MongoDB trong NodeJS

Insert / Update / Delete / Select MySQL trong NodeJS

Insert / Update / Delete / Select MySQL trong NodeJS

Top