2013-03-29 21 views
10

Tôi muốn tạo hàm javascript 'chờ'. tôi nên chỉnh sửa cái gì?Hàm Javascript wait()

function wait(waitsecs){ 
setTimeout(donothing(), 'waitsecs'); 
} 

function donothing() { 

} 
+0

Bạn có thể có nghĩa là 'setTimeout (donothing(), waitsecs);' nhưng tôi không thấy điểm này là gì. 'setTimeout' không chặn, và bạn không nên tạo một sự chờ đợi. http://stackoverflow.com/q/951021/139010 –

+0

Câu hỏi hay hơn là * tại sao * bạn có muốn có chức năng 'chờ đợi 'không? –

+0

Mã này gọi donothing * ngay lập tức * và chuyển vào chuỗi, không phải giá trị của tham số. 'setTimeout (donothing, waitsecs)' sẽ là một nỗ lực tốt hơn .. một wrapper ngớ ngẩn. –

Trả lời

38

Javascript không được tạo luồng, do đó, "chờ" sẽ đóng băng toàn bộ trang (và có thể khiến trình duyệt ngừng hoàn toàn tập lệnh).

Để giải quyết cụ thể vấn đề của bạn, bạn nên loại bỏ các dấu ngoặc sau donothing trong setTimeout cuộc gọi của bạn, và làm cho waitsecs một số không phải là một chuỗi:

console.log('before'); 
setTimeout(donothing,500); // run donothing after 0.5 seconds 
console.log('after'); 

Nhưng điều đó sẽ không ngừng thực hiện; "sau" sẽ được ghi lại trước khi chức năng của bạn chạy.

Để chờ đúng cách, bạn có thể sử dụng chức năng ẩn danh:

console.log('before'); 
setTimeout(function(){ 
    console.log('after'); 
},500); 

Tất cả các biến của bạn vẫn sẽ ở đó trong "sau khi" phần. Bạn không nên xâu chuỗi những thứ này - nếu bạn thấy mình cần, bạn cần phải xem xét cách bạn đang cấu trúc chương trình. Ngoài ra, bạn có thể muốn sử dụng setInterval/clearInterval nếu cần lặp lại.

+1

một mã đơn giản! :) –

4

Bạn không nên chỉnh sửa, bạn nên hoàn toàn xóa nó.

Mọi nỗ lực thực hiện dừng thực hiện trong một khoảng thời gian nhất định sẽ khóa trình duyệt và chuyển sang trạng thái Không phản hồi. Điều duy nhất bạn có thể làm là sử dụng chính xác setTimeout.

+0

+1 đây là câu trả lời hay hơn. – Sajmon

+14

Tôi nghĩ [câu trả lời của Dave] (http://stackoverflow.com/a/15694534/53926) là tốt hơn. Ít sủa hơn lời khuyên thực sự. – Xavi