2009-08-03 18 views

Trả lời

158

Bạn muốn setInterval():

var intervalID = setInterval(function(){alert("Interval reached");}, 5000); 

Tham số đầu tiên để setInterval() cũng có thể là một chuỗi mã để được đánh giá.

Bạn có thể xóa một hàm tuần hoàn với:

clearInterval(intervalID); 
+14

Tôi upvoted và sau đó quyết định hủy bỏ upvote của tôi (nhưng không downvote) bởi vì bạn đang sử dụng một đối số chuỗi để setInterval. Chức năng hầu như luôn luôn được sử dụng trong lợi của một đối số chuỗi, cho hiệu quả, an ninh, và cho các tính năng đóng cửa của họ. –

+2

Đó là tốt, tôi không nhớ. 'setInterval()' là câu trả lời đúng cho câu hỏi, bất kể tham số là gì. Nó chỉ là một ví dụ, và cả hai phương pháp đều theo định nghĩa đúng. – zombat

+2

Tôi đồng ý với Jason S; nó thực sự nên là một chức năng. Trong ví dụ của bạn, vấn đề duy nhất là mất hiệu suất không đáng kể, nhưng đó là một thói quen xấu để xâm nhập vào. –

3

có - hãy xem setInterval and setTimeout để thực thi mã tại một số thời điểm nhất định. setInterval sẽ là một để sử dụng để thực thi mã định kỳ.

Xem demo and answer here để sử dụng

1

Vì bạn muốn chức năng được thực hiện định kỳ , sử dụng setInterval

2
function test() { 
alert('called!'); 
} 
var id = setInterval('test();', 10000); //call test every 10 seconds. 
function stop() { // call this to stop your interval. 
    clearInterval(id); 
} 
+0

lol này đã được trả lời một cách nhanh chóng. heh. Xin lỗi cho đăng bài gấp đôi. –

14

Mọi người đều có một giải pháp setInterval setTimeout/rồi. Tôi nghĩ rằng điều quan trọng cần lưu ý là bạn có thể chuyển các hàm tới setInterval, không chỉ các chuỗi. Nó thực sự có thể là "an toàn hơn" một chút để truyền các hàm thực thay vì các chuỗi sẽ được "đánh giá" thành các hàm đó.

// example 1 
function test() { 
    alert('called'); 
} 
var interval = setInterval(test, 10000); 

Hoặc:

// example 2 
var counter = 0; 
var interval = setInterval(function() { alert("#"+counter++); }, 5000); 
+3

+1 Nếu bạn là sinh viên của trường [Crockford JavaScript] (http://javascript.crockford.com/code.html), bạn tránh đánh lừa tất cả các dạng ác của nó. –

+0

@Patrick - Tôi không nghĩ rằng "Không sử dụng $ (ký hiệu đô la) hoặc \ (dấu gạch chéo ngược) trong tên" gợi ý sẽ đi xuống tốt với lô jQuery :) –

1

Cách có nguồn gốc thực sự là setInterval()/clearInterval(), nhưng nếu bạn đã sử dụng thư viện Prototype bạn có thể tận dụng lợi thế của PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds); 

ngăn chặn này các cuộc gọi chồng chéo. Từ http://www.prototypejs.org/api/periodicalExecuter:

"nó khiên bạn chống lại nhiều hành song song của hàm gọi lại, nó sẽ mất nhiều thời gian hơn so với khoảng thời gian dành cho thực hiện (nó duy trì một nội bộ‘chạy’cờ, được bảo vệ chống lại ngoại lệ trong callback Điều này đặc biệt hữu ích nếu bạn sử dụng một để tương tác với người dùng tại các khoảng thời gian nhất định (ví dụ: sử dụng lời nhắc hoặc xác nhận cuộc gọi): điều này sẽ tránh nhiều hộp thông báo chờ đợi để được thực hiện. "

24

Xin lưu ý rằng setInterval() thường không phải là giải pháp tốt nhất để thực thi định kỳ - thực sự phụ thuộc vào javascript bạn đang thực sự gọi định kỳ.

ví dụ: Nếu bạn sử dụng setInterval() với khoảng thời gian 1000ms và trong hàm tuần hoàn, bạn thực hiện cuộc gọi ajax đôi khi mất 2 giây để quay lại, bạn sẽ thực hiện cuộc gọi ajax khác trước khi phản hồi đầu tiên quay lại. Điều này thường không mong muốn.

Nhiều thư viện có phương pháp định kỳ bảo vệ chống lại những cạm bẫy khi sử dụng setInterval một cách ngây thơ như ví dụ mẫu thử do Nelson đưa ra.

Để đạt được thực hiện định kỳ mạnh mẽ hơn với một chức năng mà có một cuộc gọi ajax jQuery trong đó, hãy xem xét một cái gì đó như thế này:

function myPeriodicMethod() { 
    $.ajax({ 
    url: ..., 
    success: function(data) { 
     ... 
    }, 
    complete: function() { 
     // schedule the next request *only* when the current one is complete: 
     setTimeout(myPeriodicMethod, 1000); 
    } 
    }); 
} 

// schedule the first invocation: 
setTimeout(myPeriodicMethod, 1000); 

phương pháp khác là sử dụng setTimeout nhưng theo dõi thời gian trôi qua trong một biến và sau đó đặt sự chậm trễ thời gian chờ trên mỗi lời gọi động để thực thi một hàm gần với khoảng thời gian mong muốn nhất có thể nhưng không bao giờ nhanh hơn bạn có thể nhận được phản hồi.

+0

setTimeout (myPeriodicMethod, 1000); được gọi là 2 lần. nó có được yêu cầu không? Tôi nghĩ rằng thiết lập thời gian ra nên được gọi chỉ trong chức năng đầy đủ –

+0

Có setTimeout thứ hai() không phải là một yêu cầu, bạn chỉ có thể gọi myPeriodicMethod() mà sẽ thực hiện cuộc gọi ajax đầu tiên ngay lập tức ... nhưng nếu bạn muốn * lịch trình nó * với một sự chậm trễ từ cuộc gọi đầu tiên bạn có thể viết nó như tôi đã viết. –

1

Câu hỏi cũ nhưng .. Tôi cũng cần một nhân viên nhiệm vụ định kỳ và viết TaskTimer. Điều này cũng hữu ích khi bạn cần chạy nhiều tác vụ trong các khoảng thời gian khác nhau.

// Timer with 1000ms (1 second) base interval resolution. 
var timer = new TaskTimer(1000) 

// Add task(s) based on tick intervals. 
timer.addTask({ 
    name: 'job1',  // unique name of the task 
    tickInterval: 5, // run every 5 ticks (5 x interval = 5000 ms) 
    totalRuns: 10,  // run 10 times only. (set to 0 for unlimited times) 
    callback: function (task) { 
     // code to be executed on each run 
     console.log(task.name + ' task has run ' + task.currentRuns + ' times.'); 
    } 
}); 

// Start the timer 
timer.start(); 

TaskTimer hoạt động cả trong trình duyệt và Nút. Xem documentation cho tất cả các tính năng.

Các vấn đề liên quan