2009-04-23 31 views
7

Có bất kỳ thứ gì có sẵn trong JavaScript (tức là không thông qua "plugin") cho phép tôi thực hiện điều gì đó như setTimeout hay không, nhưng thay vì nói trong bao nhiêu mili giây điều gì đó sẽ xảy ra, tôi cho nó một ngày đối tượng nói với nó khi làm điều gì đó?setTimeout nhưng trong một thời gian nhất định

setToHappen(function() { 
    alert('Wake up!'); 
}, new Date("...")); 

Và vâng, tôi biết tôi có thể làm điều này bằng cách đơn giản trừ new Date() với đối tượng ngày hiện tại của tôi (hoặc có thể đó là cách khác xung quanh) để có được số lượng mili giây, nhưng tôi vẫn muốn biết.

Trả lời

17

Bạn sẽ phải tìm số lượng mili giây giữa hiện tại và đối tượng ngày của bạn.

function setToHappen(fn, d){ 
    var t = d.getTime() - (new Date()).getTime(); 
    return setTimeout(fn, t); 
} 
+1

bạn không phải nhân với 1000 để nhận được mili giây? –

+1

@Pim, không bạn không. 'getTime()' trả về số mili giây từ 00:00:00 1/1/1970 và đối tượng ngày tương ứng. – James

+0

AH ok, tôi nghĩ rằng nó đã được trong vài giây. –

6

Không, nhưng bạn có thể dễ dàng viết chức năng của riêng bạn. Chỉ cần tính toán sự khác biệt giữa bây giờ và thời điểm đã cho trong mili giây và gọi setTimeout với điều đó.

Something như thế này:

setToHappen = function(fn, date){ 
    var now = new Date().getTime(); 
    var diff = date.getTime() - now; 
    return setTimeout(fn, diff); 
} 

EDIT: loại bỏ các nhân thêm bởi 1000, nhờ chris đã chỉ mà ra!

+0

Điều này là sai, getTime đã trả về mili giây. – Chris

+0

Bạn được hoan nghênh! Cảm ơn bạn đã sửa. – Chris

3

Kể từ khi mọi người đang nói về tính toán khoảng thời gian chờ sử dụng date đối tượng, cần lưu ý rằng, trong Firefox, tối đa giá trị setTimeout() sẽ chấp nhận cho tham số khoảng là 2147483647 (2^31-1) như PRIntervalTime là số nguyên 32 bit đã ký. Điều đó xuất hiện chỉ dưới 25 ngày.

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