2010-04-20 28 views
35

Ví dụ, tôi đang thiết lập một khoảng thời gian nhưCó cách nào để kiểm tra xem var có đang sử dụng setInterval() không?

timer = setInterval(fncName, 1000); 

và nếu tôi đi và làm

clearInterval(timer); 

nó rõ ràng khoảng thời gian nhưng là có một cách để kiểm tra xem nó xóa khoảng? Tôi đã cố gắng nhận được giá trị của nó trong khi nó có một khoảng thời gian và khi nó không, nhưng cả hai dường như chỉ là số.

+1

nó hoạt động (xóa nó) - vì vậy tôi không chắc tại sao bạn cần kiểm tra? – scunliffe

+2

id chỉ muốn biết nếu có một khoảng thời gian chờ đợi tại bất kỳ thời gian cụ thể. – chadley

Trả lời

83

Không có cách nào trực tiếp để thực hiện những gì bạn đang tìm kiếm. Thay vào đó, bạn có thể thiết timer false mỗi khi bạn gọi clearInterval:

// Start timer 
var timer = setInterval(fncName, 1000); 

// End timer 
clearInterval(timer); 
timer = false; 

Bây giờ, timer sẽ hoặc là sai hoặc có giá trị tại một thời gian nhất định, vì vậy bạn chỉ có thể kiểm tra với

if (timer) 
    ... 

Nếu bạn muốn gói gọn điều này trong một lớp học:

function Interval(fn, time) { 
    var timer = false; 
    this.start = function() { 
     if (!this.isRunning()) 
      timer = setInterval(fn, time); 
    }; 
    this.stop = function() { 
     clearInterval(timer); 
     timer = false; 
    }; 
    this.isRunning = function() { 
     return timer !== false; 
    }; 
} 

var i = new Interval(fncName, 1000); 
i.start(); 

if (i.isRunning()) 
    // ... 

i.stop(); 
+1

đây là những gì tôi dự định làm nếu không có câu trả lời cho câu hỏi của tôi. tôi đã viết một cái gì đó tương tự: 'var stopInterval = function (varname) { clearInterval(); varname = false; } var isRunning = function (varname) { return !!varname; } ' tôi biết điều này chính xác sẽ không hoạt động bởi vì varname có thể sẽ là một chuỗi, do đó làm cho nó luôn luôn đúng, nhưng ý tưởng của nó làm việc cho tôi. theo cách của bạn cũng sẽ làm việc nhưng mọi người hãy cẩn thận rằng setInterval() cung cấp cho var một giá trị số và nếu nó có thể xuất hiện dưới dạng 1 hoặc 0 có nghĩa là t/f. – chadley

+1

eh, tôi đoán định dạng không hoạt động trong các bình luận ... xấu của tôi. có ai biết làm thế nào để định dạng mã trong một bình luận hoặc là chỉ không được phép ở tất cả? – chadley

+3

Sử dụng 'if (timer! == false)' để tránh sự cố số. (Đếm các dấu bằng) – yankee

5

Giá trị trả lại từ setTimeoutsetInterval là các giá trị hoàn toàn mờ. Bạn không thể lấy được ý nghĩa nào từ chúng; chỉ sử dụng cho họ là quay lại clearTimeoutclearInterval.

Không có hàm nào để kiểm tra xem giá trị có tương ứng với khoảng thời gian chờ/khoảng thời gian hoạt động hay không, xin lỗi! Nếu bạn muốn có một bộ đếm thời gian có trạng thái mà bạn có thể kiểm tra, bạn phải tạo các hàm bao bọc của riêng bạn để nhớ trạng thái của bộ/xóa là gì.

+0

cảm ơn bạn đã xác nhận của bạn – chadley

1

Bạn COULD ghi đè phương thức setInterval và thêm khả năng theo dõi khoảng thời gian của bạn. Đây là một ví dụ untestet để phác thảo ý tưởng. Nó sẽ làm việc trên cửa sổ hiện tại (nếu bạn có nhiều, bạn có thể thay đổi điều này với sự trợ giúp của đối tượng nguyên mẫu) và điều này sẽ chỉ hoạt động nếu bạn ghi đè các hàm TRƯỚC KHI bất kỳ chức năng nào mà bạn quan tâm theo dõi đều được đăng ký:

var oldSetInterval = window.setInterval; 
var oldClearInterval = window.clearInterval; 
window.setInterval = function(func, time) 
{ 
    var id = oldSetInterval(func, time); 
    window.intervals.push(id); 
    return id; 
} 
window.intervals = []; 
window.clearInterval = function(id) 
{ 
    for(int i = 0; i < window.setInterval.intervals; ++i) 
    if (window.setInterval.intervals[i] == id) 
    { 
     window.setInterval.intervals.splice(i, 1); 
    } 
    oldClearInterval(id); 
} 
window.isIntervalRegistered(id) 
{ 
    for(int i = 0; i < window.setInterval.intervals; ++i) 
    if (window.setInterval.intervals[i] == func) 
     return true; 
    return false; 
} 



var i = 0; 
var refreshLoop = setInterval(function(){ 
    i++; 
}, 250); 

if (isIntervalRegistered(refrshLoop)) alert('still registered'); 
else alert('not registered'); 
clearInterval(refreshLoop); 
if (isIntervalRegistered(refrshLoop)) alert('still registered'); 
else alert('not registered'); 
1

Giải pháp cho vấn đề này: Tạo bộ đếm chung được tăng lên bên trong mã của bạn được thực hiện bởi setInterval. Sau đó, trước khi bạn gọi lại setInterval, kiểm tra xem bộ đếm có tăng STILL hay không. Nếu vậy, setInterval của bạn vẫn hoạt động. Nếu không, bạn tốt để đi.

-1

Rất nhiều câu trả lời phức tạp trên, phương pháp này chỉ hoạt động tốt đối với tôi:

if (typeof timer == 'undefined') 
{ 
    //timer has been cleared 
} 
+4

Tôi đã di chuyển xuống thông qua tất cả các câu trả lời phức tạp suy nghĩ cùng một điều chính xác. Tôi sắp đăng câu trả lời giống như bạn có ở đây. Không cần phải overcomplicate mọi thứ, mọi người! –

+4

Điều này không chính xác. Ít nhất là không có trong các phiên bản Chrome mới hơn. Tôi biết điều này là cũ nhưng tôi nghĩ rằng tôi sẽ đăng bài. 'var test = setInterval (function() {console.log ('chạy');});', 'typeof test // trả về" number "', 'clearInterval (test);', 'typeof test // returns" số "'. Điều này cho thấy biến không được đặt thành không xác định khi được xóa. – PJH

+0

không sao, vì vậy hãy đảm bảo nó được đặt là không xác định khi bộ hẹn giờ bị xóa với test = clearInterval (test); – shazbot

1

Tôi đã làm điều này như dưới đây, vấn đề của tôi đã được giải quyết. bạn nên đặt giá trị như "false", khi bạn clearTimeout bộ hẹn giờ.

var timeer=false; 
---- 
---- 
if(timeer==false) 
{ 
    starttimer(); 
} 
----- 
----- 
function starttimer() 
{ 
    timeer=setInterval(activefunction, 1000); 
} 

function pausetimer() 
{ 
    clearTimeout(timeer); 
    timeer=false; 
} 
+0

Giải pháp đơn giản - hoạt động hoàn hảo. – Syno

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