6 sự khác nhau giữa setinterval và settimeout là gì
Nếu bạn không muốn một hàm của mình thực hiện ở thời điểm hiện tại mà sẽ thực hiện ở một thời điểm khác thì trong Javascript có 2 phương thức để làm việc đó là:
setTimeout()Cú pháp let demo = setTimeout(func|code, [delay], [arg1], [arg2], ...) Trong đó:
Ví dụ sau đây sẽ giúp bạn dễ hình dung hơn: function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); Hàm sayHi() sẽ được gọi sau thời gian 1 giây. Ví dụ với hàm có tham số: function sayHi(thamso1, thamso2) { alert( thamso1+ ', ' + thamso2); } setTimeout(sayHi, 1000, "Hello", "Thái"); // Kết quả Nếu đối số đầu tiên là một chuỗi, thì JavaScript sẽ tạo một hàm từ nó. Do đó bạn cũng có thể làm như sau: setTimeout("alert('Hello')", 1000); Hoặc bạn có thể sử dung arrow functions như sau: setTimeout(() => alert('Hello'), 1000); Lỗi mà mọi người thường gặp trong quá trình sử dụng setTimeout() là việc thêm dấu function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 3 vào sau hàm: setTimeout(sayHi(), 1000); // Kết quả undefined \==> Vì function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 1 mong đợi một tham chiếu đến một hàm. Và ở đây function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 5chạy hàm, và kết quả thực thi của nó được chuyển tới function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 1. Vì thế, kết quả của function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 5 là function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 8 , vì vậy không có gì được lên lịch. clearTimeout()Khi sử dụng setTimeout nó cũng sẽ trả về một timerId mà chúng ta có thể sử dụng để hủy bỏ việc thực thi. Cú pháp let timerId = setTimeout(...); clearTimeout(timerId); Ví dụ let timerId = setTimeout(() => alert("Hủy bỏ !"), 1000); alert(timerId); clearTimeout(timerId); alert(timerId); Trong đoạn code trên tôi đã lên lịch cho chức năng và sau đó hủy bỏ nó, vậy nên sẽ không có gì xảy ra. Kết quả trả về của tôi sẽ chỉ là 1 số nào đó. setInterval()Cú pháp let demo = setInterval(func|code, [delay], [arg1], [arg2], ...) Các đối số của setInterval() cũng giống với setTimeout(), nhưng thay thay vì chạy chức năng một lần thì nó sẽ chạy thường xuyên sau một khoảng thời gian nhất định. Ví dụ var demo = setInterval(runAfter, 1000); function runAfter() { alert("Hello world!"); } Sau 1 giây thì hàm runAfter() sẽ chạy và lặp lại liên tục Để dừng việc lặp lại này ta có thể sử dụng
Ví dụ function sayHi() { alert('Hello'); } setTimeout(sayHi, 1000); 0 Với đoạn code trên thì sau mỗi 2 giây sẽ hiển thị thông báo 1 lần và sau 5 giây thì hàm sẽ dừng lại. Hy vọng bài viết giúp bạn hiểu rõ hơn về setInterval() và setTimeout(). Nếu cảm thấy bài viết có ích hãy chia sẻ để mọi người cùng biết nha! Tag: Tim hieu ham setTimeout va setInterval trong JavaScript, cach su dung ham clearTimeout va clearInterval trong Javascript va su khac biet cua no. Huong dan hoc Javascript , Hoc Javascript truc tuyen , Tu hoc Javascript , Video huong dan hoc Javascript , download tai lieu hoc Javascript , hoc Javascript mien phi , hoc Javascript online , hoc Javascript truc tuyen , hoc Javascript co ban , hoc Javascript nang cao , tai lieu hoc Javascript , Ebook hoc Javascript , hoc Javascript can ban , sach hoc javascript , học lập trình javascript. Đôi khi bạn cần phải thực hiện hành động sau một khoảng thời gian nhất định. Để thực hiện điều này, bạn có thể sử dụng phương thức
0. Sau đây là cách khai báo và sử dụng setTimeout trong JavaScript. Cú pháp hàm
0 là:
Trong đó:
Ví dụ đoạn code sau gọi hàm
7 sau 1 giây:
Ví dụ với tham số truyền vào hàm:
Nếu tham số đầu tiên là string, JavaScript engine sẽ tạo hàm từ string đó để thực thi, ví dụ:
Tuy nhiên, cách sử dụng string là không được khuyến khích, bạn có thể thay thế bằng arrow function như sau:
Chú ý: Tham số đầu tiên là hàm, chứ không phải kết quả của việc gọi hàm, nhiều bạn hay bị nhầm lẫn như sau:
Khi gọi hàm
8 như trên, kết quả của hàm
8 được truyền vào hàm
0. Mà hàm
0 chỉ chấp nhận truyền vào là function. Do đó, đoạn code trên sẽ không thực hiện gì sau 1 giây. Khi bạn gọi hàm setTimeout trong JavaScript, kết quả trả về là một số nguyên
2 - định danh cho hành động với timeout. Để hủy bỏ hành động, bạn chỉ cần gọi
3 như sau:
Ví dụ bạn dự định gọi một hàm sau khoảng thời gian delay là 1 giây. Nhưng sau đó, bạn lại hủy bỏ hành động này:
Hàm
4 có cú pháp tương tự như hàm
0:
Trong đó, tất cả tham số đều có ý nghĩa giống với hàm
0. Nhưng khác với hàm
0 là chỉ thực hiện hành động một lần, hàm
4 sẽ gọi hàm thường xuyên sau mỗi khoảng thời gian delay. Để dừng hành động, bạn chỉ cần gọi hàm
9. Ví dụ sau hiển thị
0 sau mỗi 2 giây và sau đó 5 giây thì dừng lại:
Ngoài cách sử dụng
4 để thực hiện một hành động lặp đi lặp lại, bạn có thể sử dụng hàm setTimeout trong JavaScript theo cách lồng nhau như sau:
0 Trong ví dụ trên, cứ sau mỗi 2 giây thì hàm
7 sẽ được gọi. Mà ở cuối hàm
7 mình lại gọi tiếp
0 với hàm
7 - tương tự cách gọi hàm đệ quy. Cách gọi hàm
0 lồng nhau như trên giúp bạn xử lý
3 linh hoạt hơn so với cách dùng
4. Vì bạn có thể tùy chỉnh thời gian
3 cho mỗi lần lặp. Giả sử bạn cần tạo request lên server sau mỗi 5 giây để cập nhật dữ liệu. Tuy nhiên, server có thể bị quá tải. Dựa vào trạng thái server hiện tại, bạn có thể tăng thời gian delay lên 10, 20, 30, giây... cho phù hợp, ví dụ:
1 ► Cách sử dụng
0 lồng nhau cho phép
3 chính xác hơn giữa mỗi lần thực hiện hành động so với cách dùng
4. Ví dụ dùng
4:
2 Ví dụ dùng
0 lồng nhau:
3 Hàm
4 thực hiện hành động
6 sau mỗi 100ms. Tuy nhiên, hành động
6 cũng chiếm thời gian. Do đó, thời gian thực tế giữa hai lần chạy
6 là nhỏ hơn 100ms. Thậm chí là thời gian chạy
6 có thể nhiều hơn 100ms thì lần chạy
6 tiếp theo sẽ được gọi ngay lập tức sau lần gọi trước. Nói cách khác là không có thời gian delay giữa hai lần chạy
6. Nhưng với cách sử dụng hàm
0 lồng nhau thì khác. Với cách này, hàm
0 tiếp theo chỉ được gọi khi hàm
6 thực hiện xong. Nghĩa là thời gian giữa hai lần chạy
6 sẽ đảm bảo khoảng 100ms. Như mình đã nói trong bài viết về garbage collection trong JavaScript, khi một giá trị là không thể tiếp cận thì nó sẽ được giải phóng khỏi bộ nhớ. Đối với hàm truyền vào
6, JavaScript engine sẽ tạo một tham chiếu nội bộ tới hàm thực thi để đảm bảo hàm này không bị giải phóng. Với hàm
0, hàm truyền vào sẽ được giữ trong bộ nhớ cho tới khi hàm được gọi:
4 Với hàm
4, hàm truyền vào được giải phóng khỏi bộ nhớ sau khi gọi
9. Giả sử hàm truyền vào
4 tham chiếu đến biến bên ngoài. Vì hàm này luôn tồn tại cho đến khi gọi
9, nên biến được tham chiếu đến cũng sẽ không được giải phóng. Có một trường hợp đặc biệt với hàm
0 là thời gian
3 bằng 0. Theo lý thuyết, khi
4 thì hành động được thực hiện ngay lập tức. Nhưng thực tế, hành động sẽ được thực hiện ngay khi code luồng chính thực hiện xong, ví dụ:
5 Trong ví dụ trên, câu lệnh
5 được thực hiện trước. Và ngay sau khi câu lệnh này thực hiện xong thì câu lệnh
6 được thực hiện. Đối với cách gọi hàm
0 lồng nhau, sau 5 lần gọi hàm, thời gian delay sẽ được set bằng 4ms, ví dụ:
6 Xem kết quả trên, bạn thấy rằng thời gian delay giữa mỗi lần gọi trong 5 lần đầu tiên là khoảng 2ms. Nhưng sau 5 lần thì thời gian delay tăng lên là khoảng 4ms. Đây chính là giới hạn của hàm
0 trên trình duyệt. Và giới hạn này cũng gặp phải khi sử dụng hàm
4. Ở môi trường khác như phía server, giới hạn này không gặp phải vì trên Node.js có hàm . Hàm
0 trong JavaScript cho phép thực hiện hàm
1 một lần sau một khoảng thời gian
3 với các tham số truyền vào là
3. Hàm
4 cũng tương tự như hàm
0, nhưng hàm
1 được thực hiện sau mỗi lần
3. Để hủy bỏ không gọi hàm
1 nữa, bạn có thể gọi hàm
9 hoặc
9 với
2 là kết quả trả về sau khi gọi hàm
0 hoặc
4. Việc gọi hàm
0 lồng nhau giúp bạn xử lý linh hoạt giá trị
3 hơn so với cách sử dụng
4. Trường hợp gọi hàm
7 với giá trị
4, tương đương với
9 sẽ thực hiện hàm
1 ngay sau khi luồng code chính thực hiện xong. Đối với trình duyệt, sau 5 lần gọi hàm
9 lồng nhau hoặc với
02 thì thời gian delay được set khoảng 4ms. Viết hàm
03 để in ra một số từ
04 đến
05 sau mỗi 1 giây theo hai cách:
Xem đáp án ► Cách 1: sử dụng
4
7 ► Cách 2: sử dụng
0
8 Trong đoạn code sau, hàm
0 được gọi với thời gian delay là 100ms. Sau đó là một vòng lặp
11 với số lần lặp khoảng 100000000 lần. Mà thời gian thực hiện vòng lặp lớn này thường hơn 100ms. |