Xử lý Timers trong Nodejs
Trong bài viết này chúng ta sẽ cùng nhau đi tìm hiểu về hàm Timers trong NodeJS, cách sử dụng timer và các ví dụ cụ thể. Trong các bài trước về Global Obejct mình có đề cập qua về các hàm có trong modue Timer của NodeJS nhưng chưa giải thích đầy đủ, vì vậy bài này mình sẽ nói chi tiết hơn.
1. Module timers trong NodeJS
Module timers là một global object dùng để đặt thời điểm các hàm được gọi ở một vài khoảng thời gian. Bởi các hàm timer là những global obejct nên không cần phải khai báo require('timers')
trong khi cần sử dụng các API của nó.
Các hàm timers khá là cần thiết trong quá trình lập trình, sử dụng nó trong NoedJS cũng giống như sử dụng với các ngôn ngữ khác như C, Python, Java,..nó giúp đặt thời gian các hàm có thể chạy một cách lặp lại.
Timers phân chia thành 2 loại function chính:
Bài viết này được đăng tại [free tuts .net]
Set Timer function
- setImmediate() : chạy ngay lập tức (như cái tên của nó) =))
- setTimeout() : chạy trong một khoảng thời gian.
- setInterval(): lặp đi lặp lại trong khoảng thời gian
Clear timer functions
- clearImmediate() : dừng một setImmediate objects, tạo bởi hàm setImmediate()
- clearTimeout() : dừng một setTimeout objects, tạo bởi hàm setTimeout()
- clearInterval() : dừng một setInterval objects, tạo bởi hàm setInterval()
2. Tìm hiểu về các hàm Timers
Phần này mình sẽ liệt kê ra các hàm timers hay dùng để các bạn có thể hiểu rõ hơn nhé. Các hàm timer trong NodeJS cũng giống như các API về timers cung cấp bởi trình duyệt ,nhưng các hàm timers trong NodeJS được xây dưng dựa trên NodeJS event loops (vòng lặp sự kiện).
Lưu ý rằng hàm timers này được trình biên dịch định nghĩa chứ không có sẵn trong ngôn ngữ javascript nha các bạn !
Timer setInterval()
Hàm này có nhiệm vụ lặp lại sau một khoảng thời gian đặt trước. Để sử dụng ta có pháp:
setInterval(callback, delay[, ...args])
có 3 tham số mà chúng ta có thể thêm vào:
- callback: <function> hàm này sẽ được gọi khi khoảng thời gian delay xảy ra.
- delay : <number> thời gian lặp lại của hàm callback được tính bằng mili giây
- [...args] : bất cứ gì bạn muốn truyền vào hàm callback
Nếu thời gian delay lớn hơn 2147483647
hoặc nhỏ hơn 1 thì sẽ tự động set về 1. Các số không phải số nguyên sẽ tự động được chuyển sang số nguyên. Trong trường hợp tham số callback không phải là một hàm thì sẽ trả lại thông báo lỗi.
Chúng ta xem qua ví dụ bên dưới:
let a = setInterval(function () { console.log('repeat !!!') //in ra các tham số truyền vào của hàm callback console.log(arguments) }, 1000, 'freetuts', 'học lập trình nodejs') //Hàm setInterval sẽ trả lại một obejct console.log(typeof a)
Trong đoạn code bên trên mình cho hàm callback chạy mỗi 1 giây mà truyền vào đó các agruments. Trong hàm callback sẽ log ra chuỗi reapeat !! và các tham số được truyền vào. Cho bạn nào chưa biết thì object agruments là object có sẵn trong các hàm chứa các tham số được truyền vào hàm đó. Chúng ta sẽ thấy đoạn code trên chạy hình:
Timer setTimeout()
Khi hàm setTimeout được kích hoạt thì callback function sẽ chạy sau một khoảng thời gian đặt trước. Ta có cú pháp như sau :
setTimeout(callback, wait[, ...args])
có 3 tham số mà chúng ta có thể thêm vào:
- callback: <function> hàm này sẽ được gọi khi khoảng thời gian wait xảy ra.
- wait: <number> thời gian chờ của hàm callback được tính bằng mili giây
- [...args] : bất cứ gì bạn muốn truyền vào hàm callback
Nếu thời gian delay lớn hơn 2147483647 hoặc nhỏ hơn 1 thì sẽ tự động set về 1. Các số không phải số nguyên sẽ tự động được chuyển sang số nguyên. Trong trường hợp tham số callback không phải là một hàm thì sẽ trả lại thông báo lỗi.
Lấy ví dụ nhỏ để các bạn hiểu rõ hơn nha :
setTimeout(function (){ console.log('run !') }, 2000)
Trong ví dụ này hàm callback sẽ chỉ được chạy sau 2 giây. Nó khá là đơn giản nên bạn xem hình bên dưới sẽ hiểu hơn nhé !
Timer setImmediate
Như cái tên nó hàm này sẽ chạy ngay lập tức. Ta có cú pháp như sau :
setImmediate(callback, [, ...args])
có 3 tham số mà chúng ta có thể thêm vào:
- callback: <function> hàm này sẽ được gọi ngay lập tức
- [...args] : bất cứ gì bạn muốn truyền vào hàm callback
Chúng ta có ví dụ bên dưới:
setImmediate(function() { console.log('1') }) setImmediate(function() { console.log('2') setImmediate(function() { console.log('3') }) })
Khi nhiều lệnh gọi đến setImmediate() được thực hiện, các hàm gọi lại được xếp hàng để thực hiện theo thứ tự mà chúng được tạo. Toàn bộ hàng đợi gọi lại được xử lý mỗi lần lặp vòng lặp sự kiện (event loop). Nếu setImmediate() được gọi từ bên trong một callback function, nó đó sẽ không được kích hoạt cho đến khi có event loop tiếp theo. Khi chạy chương trình trên sẽ có kết quả:
1 2 3
Trên đây là những kiến thức cơ bản về Timers trong Nodejs, nó cũng là phần bạn cần phải biết . Mong bài viết này có thể giúp ích cho bạn cho việc lập trình với Nodejs, cảm ơn bạn đã quan tâm bài viết này.