2013-03-05 7 views
6

'de sabit bir sürenin ardından işlevin yürütülmesini durdurma Bir işlevin belirli bir saniye boyunca çalışmasına izin vermem ve sonra sonlandırması gerekir. JQuery'yi veya web çalışanlarını kullanabilirim, ancak bunu yapma girişimi doğrudan başarısız. Yardım içinjavascript

Tks bu şimdi çalışır:

startT = new Date().getTime(); 
i = 1; 

while(true){ 
    now = new Date().getTime(); 
    if((now - startT) > 100) { 
     break; 
    } 

    i++; 
} 

alert(i); 

cevap

3

JavaScript (çoğunlukla) tek dişli olduğu için önerilen yöntem çalışmıyor - döngü sonsuz döngüye başlar, böylece setTimeout işleyicisi çağrılır geçmez keepGoing asla ayarlanmadı, bu yüzden döngü bitemez.

Fonksiyonun bitirileceği mutlak bir süreyi belirlemek her zaman en basit olanıdır ve sık sık (yani her tekrarda değil) o anki zamanın o noktadan geçip geçmediğini kontrol etmek en basit yoldur.

Geçen süre boyunca testin verimliliği ile işlevine izin vermek için hazırladığınız "fazla mesai" miktarı arasında makul bir uzlaşma sağlayan birkaç yineleme seçin.

1

Sayım sonsuz bir döngüye başlar, kodunuz asla setTimeout() öğesine ulaşmaz.

1

Üç konular:

  • Kişisel aşımı bir milisaniyede ateşe ayarlanır
  • Sizin count bitirmek asla çünkü setTimeout ulasilmayacagi
  • Sizin alertwhile sonra count içinden çağrılmalıdır veya setTimeout geri arama içinden.

Bu sorunların ele alınması ve kodunuzun çalışması gerekir. Yine de, bir bitiş tarihi ayarlayarak ve o tarihle while'da karşılaştırarak gitmiş olabilirdim.

0

Ben amacının ne olduğunu bilmiyorum ama keepGoing arada çalışan diğer bazı yerde değiştirmek için bir şans vermek için bir süre

function count() { 
    while(keepGoing) { 
     i = i+1; 
    } 
} 

kesmek zorunda kalacak. Ayrıca bunu asla:

tamamen her şey için iplik engelliyor
while(keepGoing) { 
    i = i+1; 
} 

... Sen küçük parçalar halinde işlevin iş bölmek ve küçük gruplar halinde çalıştırmak için setTimeout veya setInterval kullanmak zorunda olacak , size istediğinizin yakın iken aşağıdaki gibi bir şey: Eğer kalanını açlıktan olmadan tam olarak 10 saniye gerekiyorsa

var piece_n=0; 
var keepGoing = true; 
var interval_id = setInterval(function() { 
    if(keepGoing){ 
     //do_a_short_piece_of_work(piece_n); 
     piece_n++; 
    }else{ 
     clearInterval(interval_id); 
    } 
},500); //ticking every half second 

setTimeout(function() { keepGoing = false; }, 10000); //run for a small bit more than 10 to 10.5 seconds + do_a_short_piece_of_work() execution time 

Eğer setTimeout bir dizi ayarlamak gerekir ve önceden biraz bilmek gerekir (bir sonraki onaydan daha fazla) böylece son setTimeo'yu ayarlayabilirsiniz tam zamanında (geçerli tarihe ve kayıtlı başlangıç ​​tarihine bakılarak). Her şey cpu için talimatlar gibi daha küçük parçalara bölünebilir :)