2009-08-07 19 views
16

Tôi có phương thức javascript ajax để lấy dữ liệu từ một trang, v.v.Muốn có hàm javascript chạy mỗi phút, nhưng tối đa 3 lần

Tôi muốn quy trình này chạy trên một khoảng thời gian, cứ mỗi phút. Nhưng tôi không muốn nó lặp lại mãi mãi, vì vậy tối đa là 3 lần.

Cách tốt nhất để thực hiện điều này là gì?

+0

nhanh chóng và dơ bẩn, nhưng tại sao không chỉ tăng số lượt truy cập mỗi khi yêu cầu được chạy và nếu (counter <3) {intervalRun();}? – Optimate

+0

@optimate: intervalRun() là gì? – Nosredna

+0

Anh ấy muốn nói 'setInterval'. – SLaks

Trả lời

40

Như thế này:

var runCount = 0;  
function timerMethod() { 
    runCount++; 
    if(runCount > 3) clearInterval(timerId); 

    //... 
} 

var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds 
+3

+1 - đây là giải pháp tốt hơn. Với 'setInterval()' bạn tránh liên tục gọi 'setTimeout()' lặp đi lặp lại, và thời gian lặp của 'foo()' hơi nhanh hơn vì bạn không phải chờ 'foo()' xử lý mọi thứ trước thiết lập cuộc gọi tiếp theo. – zombat

+0

@zombat Trên thực tế, setTimeout() thường được ưu tiên trong nhiều kịch bản để setInterval(), chủ yếu là vì setInterval() sẽ gọi hàm 60 giây sau khi hàm đầu tiên * bắt đầu chạy *, chưa hoàn thành. Đặc biệt, hiện tại Chrome & Firefox đang giới hạn các tab nền, setInterval() đáng tin cậy hơn nhiều nếu bạn không muốn chồng lên cả ba cuộc gọi hàm đó cùng một lúc. –

1

Bạn có thể sử dụng setInterval() và sau đó bên trong hàm được gọi, hãy đếm số lần bạn đã chạy hàm và sau đó clearInterval().

Hoặc bạn có thể sử dụng setTimeout() và sau đó bên trong hàm gọi hàm setTimeout() một lần nữa cho đến khi bạn đã thực hiện nó 3 lần.

0
var testTimeInt = 3; 
function testTime(){ 

    testTimeInt--; 

    if(testTimeInt>0) 
     setTimeOut("testTime()", 1000); 

} 


setTimeOut("testTime()", 1000); 
2

Sử dụng setInterval, hãy chắc chắn để có được một tài liệu tham khảo.

var X=setInterval(....); 

Ngoài ra, có một truy cập toàn cầu

var c=0; 

Bên trong hàm được gọi bởi các setIntervale làm:

c++; 
if(c>3) window.clearInterval(X); 
4

Một cách tiếp cận tái sử dụng

function setMaxExeuctionInterval(callback, delay, maxExecutions) 
{ 
    var intervalCallback = function() 
    { 
    var self = intervalCallback; 
    if ('undefined' == typeof self.executedIntervals) 
    { 
     self.executedIntervals = 1; 
    } 
    if (self.executedIntervals == maxExecutions) 
    { 
     clearInterval(self.interval) 
    } 
    self.executedIntervals += 1; 
    callback(); 
    }; 
    intervalCallback.interval = setInterval(intervalCallback, delay); 
} 

// console.log requires Firebug 
setMaxExeuctionInterval(function(){ console.log('hi');}, 700, 3); 
setMaxExeuctionInterval(function(){ console.log('bye');}, 200, 8); 
12

Một đóng cửa dựa trên giải pháp, sử dụng.210 và clearInterval():

// define a generic repeater 
var repeater = function(func, times, interval) { 
    var ID = window.setInterval(function(times) { 
    return function() { 
     if (--times <= 0) window.clearInterval(ID); 
     func(); 
    } 
    }(times), interval); 
}; 

// call the repeater with a function as the argument 
repeater(function() { 
    alert("stuff happens!"); 
}, 3, 60000); 

EDIT: Một cách khác để thể hiện giống nhau, sử dụng setTimeout() thay vì:

var repeater = function(func, times, interval) { 
    window.setTimeout(function(times) { 
    return function() { 
     if (--times > 0) window.setTimeout(arguments.callee, interval); 
     func(); 
    } 
    }(times), interval); 
}; 

repeater(function() { 
    alert("stuff happens!"); 
}, 3, 2000); 

Có lẽ sau này là một chút dễ hiểu hơn.

Trong phiên bản setTimeout() bạn có thể đảm bảo rằng lần lặp tiếp theo chỉ xảy ra sau trước đó đã kết thúc chạy. Bạn chỉ cần di chuyển số func() dòng lên trên đường dây setTimeout().

+0

+1 Tôi thích giải pháp dựa trên đóng cửa của bạn tốt hơn so với thuộc tính dựa trên thuộc tính của tôi bên dưới. Ít nhất chúng tôi đều đang suy nghĩ về khả năng tái sử dụng: D –

3

Chức năng ẩn danh này (nó không giới thiệu bất kỳ hình cầu mới nào) sẽ làm những gì bạn cần. Tất cả những gì bạn phải làm là thay thế yourFunction bằng chức năng của bạn.

(function(fn, interval, maxIterations) { 
    var iterations = 0, 
    id = setInterval(function() { 
     if (++iterations > maxIterations) 
      return clearInterval(id); 

     fn(); 
    }, interval); 
})(yourFunction, 60000, 3); 
3

Để mở rộng Tomalak chức năng:

Nếu bạn muốn biết có bao nhiêu chu kỳ còn lại:

var repeater = function(func, times, interval) { 
    window.setTimeout(function(times) { 
    return function() { 
     if (--times > 0) window.setTimeout(arguments.callee, interval); 
     func(times); 
    } 
    }(times), interval); 
} 

và sử dụng:

repeater(function(left){ 
    //... (do you stuff here) ... 
    if(left == 0) { 
     alert("I'm done"); 
    } 
}, 3, 60000); 
4

bạn có thể làm với setInterval

var count = 0; 

var interval = setInterval(yourFunction(), 1000); 

function yourFunction(){ 

    clearInterval(interval); 
    if(count < 3){ 

    count ++; 
    interval = setInterval(yourFunction(), 1000); 
    } 

// your code 


} 
+0

Vui lòng chỉnh sửa câu trả lời của bạn và định dạng mã để làm cho nó dễ đọc. – kleopatra

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