Cách xử lý timer trong NodeJS

Trong bài viết này cùng tìm hiểu về hàm Timers trong NodeJS, cách sử dụng timer và các ví dụ cụ thể.4 min


1031
1.3k shares, 1031 points

Module timers trong NodeJS

Module timers trong NodeJS 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 object 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:

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()

Các hàm Timers trong NodeJS

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 ở NodeJS 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, 'hocweb.vn', 'timer')
//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 đó.

Timer setTimeout()

Khi hàm setTimeout được kích hoạt thì callback function trong Nodejs 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é !

setTimeout nodejs

Timer setImmediate NodeJS

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 trong NodeJS

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

Kết luận

Bài viết đã giới thiệu qua cho bạn về Timer trong NodeJS, thật hữu ích nếu bạn sử dụng phù hợp vào project, app.

Hãy đọc thêm để nâng cao kiến thức : Tối ưu tốc độ ứng dụng NodeJS khi lập trình


Like it? Share with your friends!

1031
1.3k shares, 1031 points

What's Your Reaction?

hate hate
1
hate
confused confused
1
confused
fail fail
1
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win