2012-05-12 26 views
36

Trong một đơn giản setIntervalLàm thế nào để bắt đầu vòng lặp setInterval ngay lập tức?

setInterval(function() { 
     // Do something every 9 seconds 
}, 9000); 

Hành động đầu tiên sẽ xảy ra sau 9 giây (t=9s). Làm thế nào để buộc vòng lặp thực hiện hành động đầu tiên ngay lập tức (t=0)?

Tôi nghĩ rằng đó là do cơ chế của setInterval để có vòng lặp Delay - Action - Delay - Action ...; thay vì vòng lặp Action - Delay - Action - Delay ....

EDIT: chức năng của tôi thực sự là một vòng lặp như

setInterval(function(){ 
$('.test').each(function(idx){ 
    var duration = 1000; 
    $(this).delay(duration*idx); 
    Some stuff here 
}); 
}, 4000); 

Trả lời

76

Giữ nó đơn giản. Bạn có thể sử dụng hàm được đặt tên thay vì hàm ẩn danh; gọi nó và thiết lập một khoảng thời gian cho nó.

function doSomething() { 
    console.log("tick"); 
} 
doSomething(); 
setInterval(doSomething, 9000); 

Tạo một phạm vi nếu cần thiết:

(function() { 
    function doSomething() { 
     console.log("tick"); 
    } 
    doSomething(); 
    setInterval(doSomething, 9000); 
})(); 

Cuối cùng, công trình sau đây mà không cần tạo hoặc ảnh hưởng đến x:

setInterval(function x() { 
    console.log("tick"); 
    return x; 
}(), 9000); 
+0

Giải pháp đơn giản, dễ dàng, cảm ơn! –

+1

Phần đầu tiên của câu trả lời này sẽ chậm dần, vì một 'setInterval' mới được tạo thành mỗi vòng lặp. Điều này có thể được sửa bằng cách thay thế 'window.setInterval' bằng' setTimeout'. – spikespaz

17

Đôi khi tôi sử dụng mô hình này ...

(function me() { 
    // Do something every 9 seconds 

    setTimeout(me, 9000); 
})(); 

Nó không hoàn toàn giống nhau, vì nó sẽ đợi cho đến khi làm điều gì đó được thực thi trước khi chờ ~ 9 giây để gọi lại. Tuy nhiên, điều này thường hữu ích vì vậy các sự kiện trên hàng đợi sự kiện không xếp chồng lên nhau một cách không cần thiết (tuy nhiên không chắc là một số mã sẽ mất 9 giây để chạy :)

Lưu ý rằng trong IE cũ, me sẽ rò rỉ ra ngoài phạm vi .

+0

* "Lưu ý rằng trong các trình duyệt IE cũ hơn, tôi sẽ bị rò rỉ đến phạm vi bên ngoài." * Và hai chức năng khác nhau được tạo ra, vào các thời điểm khác nhau, với cùng một mã. * Lần đầu tiên * mã của bạn chạy, đó là một trong số chúng; tất cả những lần sau đó là lần khác. Lạ lùng nhưng đúng. –

+0

Tôi muốn điều này hoạt động liên tục trên tất cả các trình duyệt. Nó thật sạch sẽ. Phiên bản nào của IE bị trục trặc? – thekingoftruth

+0

@thekingoftruth Nó sẽ * hoạt động * liền mạch, nó sẽ chỉ rò rỉ định danh 'tôi' trong IE. Từ bộ nhớ, nó <= IE8 có vấn đề. – alex

2

Sử dụng chức năng được đặt tên và gọi nó và gán nó vào khoảng thời gian.

var myFnc = function() { 
    // Do something every 9 seconds 
}; 
setInterval(myFnc, 9000); 
myFnc(); 

Tùy chọn khác là sử dụng setTimeout thay thế.

var myFnc = function() { 
    // Do something every 9 seconds 
    setTimeout(myFnc, 9000); 
}; 
myFnc(); 
+2

Đó không phải là một hàm được đặt tên.Nó là một hàm ẩn danh được gán cho một biến. * Biến * có tên, hàm không (điều này tốt cho những gì bạn đang làm, ngoại trừ một số trình gỡ rối sẽ không thể hiển thị cho bạn tên hữu ích trong ngăn xếp cuộc gọi và những người khác làm như vậy, công cụ Chrome Dev Tools và Firebug mới nhất khá thông minh]). –

12

setInterval() là hàm thực sự xấu. Tôi sử dụng phiên bản này được khử trùng, gọi hàm ngay lập tức và mất một chút thời gian, TRƯỚC KHI tham số hàm để gọi nó với định nghĩa hàm nội tuyến thực sự có vẻ hợp lý.

function startInterval(seconds, callback) { 
    callback(); 
    return setInterval(callback, seconds * 1000); 
} 
Các vấn đề liên quan