30/09/2018, 16:58
Thắc mắc- Hàm sleep trong javascript?
em có hàm này. em muốn sleep trong đoạn for như chú thích em làm như thế nào ạ ?
em dùng setTimeout nhưng không được
guitin();
function guitin(){
for (var i = 1; i < 7; i++){
alert(1);
// sleep 1s roi chay function xoatn()
}
}
function xoatn(){
alert(2);
}
Bài liên quan
Bạn có thể sử dụng setTimeout mà:
Khong được bạn á.
bạn thử chạy trong console xem
thanks bạn
Mình đã thử và thành côn đoạn này:
sao bên mình nó không sleep đc ta. nó chạy liên tục bạn ơi
Mình sử dụng ff ok cả bạn. bạn thử chỉnh sau 5s xem chạy có đúng ko.
@kayz hướng dẫn đúng rồi đó, setTimeout() mà tiến thôi , là hàm chuẩn từ ES1.0 nên chạy đc tất cả các browser từ cổ nhất tới xịn nhất.
mình dùng chrome và ff nó cũng ko chạy bạn ơi. hình như for và setTimeout không chạy với nhau.
bạn thử lấy code trên chạy trong console xem nó sleep đc ko bạn
Javascript thiết kế không sử dụng sleep. Mỗi hàm phải thực thi xong và trả control về cho browser. Nếu không mình sẽ thấy browser bị đơ.
Thực ra dùng từ delay đúng hơn, hiển thị giao diện nó từ từ cảm giác đẹp hơn
hi. cảm ơn các bạn :D. mình làm đc rùi. hàm for và setTimeout không chạy đc với nhau. nhưng mình không dùng for nữa dùng cách khác set delay được rùi
Có thể chia sẻ với mọi người ở đây không?
Mình chia sẻ với mọi người 2 cách mình tìm hiểu được để giải quyết vấn đề trên, mong có thể giúp ích được cho mọi người.
Do function setTimeout là async nên mình không thể gọi trực tiếp trong vòng for được. Do đó mình để xuất giải pháp như phía dưới:
Hoặc:
Tham khảo: http://stackoverflow.com/questions/3583724/how-do-i-add-a-delay-in-a-javascript-loop
Đạt không thích cách này lắm. Hồi trước Đạt cũng từng dùng nhưng vì nó làm đơ browser nên Đạt bỏ.
Đúng rồi
Uh, mình cũng chưa dùng nên ko biết thế nào. Mà cũng ko biết tại sao nó lại đơ ta, bạn có thể giải thích được cho mình và mọi người biết được không.
Theo mình thì bạn kia làm set delay thì chắc cũng viết một hàm tương tự như hàm sleep này ^^, ko biết có phải ko, hehe
Vì hàm này nó sẽ đếm
i
liên tục từ0
tới1e7
hoặc cho đến khi thời thời gian hiện tại - thời gian bắt đầu đã vượt qua thời gian cần chờ.Việc này dĩ nhiên sẽ chiếm CPU và Javascript sẽ chạy liên tục, không trả về control cho Browser.
Nếu bạn nói tới
setTimeout
thì đây lại là một câu chuyện khác. Đạt không làm javascript nên Đạt không dám chắc 100%. Nhưng thông thường các hàm dạng này sẽ không cósleep
mà nó sẽ đăng ký một event với hệ điều hành(OS) gọi là time event.Ví dụ, Đạt muốn code Javascript trong 5s nữa thực thi X. Thì Đạt sẽ báo với OS rằng, 5s nữa mày gửi cho tao event rằng 5s đã trôi qua. Sau đó Javascript sẽ làm công việc của nó và trả control về cho Browser.
OS sẽ có một đồng hồ riêng, dựa vào CPU tick, để tính ra thời điểm 5s kể từ khi JS đăng ký cái event này. Khi thời điểm 5s đã đến thì OS sẽ gửi một event tới, có thể là tới Brower hiện tại, để nhắc rằng sự kiện này đã xảy ra. Khi đó JS sẽ thực thi X.
Điều này sẽ chuyển việc “Chờ” đến cho OS thực hiện thông báo lại qua event. Đó là lý do tại sao hàm setTimeout là
async
chứ không phải làsync
Uhm, thì nếu như làm công việc sync để sleep thì chắc chắn nó phải chiếm tài nguyên và hệ thống phải đứng chờ rồi, tại lúc nãy mình không hiểu rõ ý “đơ” của bạn, ^^.
Còn về hàm setTimeout thì nó là callback function nên chắc chắn là async rồi. Javascript ưu tiên các hàm xử lý async mà :D.
trường hợp khác thì mình chưa rõ lắm vì mới tìm hiểu. Nhưng để gọi xoatn() 7 lần thì trong for bạn cho nó sleep lần lượt là (1000*i) là đc mà!
lần đầu mình cmt nên có gì sai mong admin và các bạn nhẹ tay!