2010-11-19 12 views
1

.defer(5000) içinde gecikme nasıl JavaScript'te bir too much recursion hata veriyor. Uygulamayı 5 saniye nasıl geciktiririm?JavaScript

rotate: function() { 
    if (!paused) { 
    this.show(counter); 

    counter = counter + 1; 

    if (counter === Spire.Rotator.data.items.length) { 
     counter = 0; 
    } 

    Spire.Rotator.rotate().defer(5000); 
    //$.proxy(Spire.Rotator.rotate, Spire.Rotator).defer(delay); 
    } 
} 

cevap

5

Tüm bu hattı:

Spire.Rotator.rotate().defer(5000); 

yanlıştır. rotate'dan hemen sonra parantezler nedeniyle, fonksiyonunuz kendini tekrar tekrar tekrar çağırıyor (sonsuz yineleme). Parantezlerin kaldırılması bu sorunu çözecektir, ancak kod muhtemelen çalışmaz. kodunu çözmek için, kullanan iki argüman olarak bir işlev ve (milisaniye cinsinden) bir gecikme kabul tarayıcı en window.setTimeout method:

setTimeout(function() { 
    Spire.Rotator.rotate(); 
}, 5000); 

Neden sadece setTimeout(Spire.Rotator.rotate, 5000);? Nedeni, bu işlevdeki this, Spire.Rotator yerine window olacaktır. (İnternette bu konuda plenty of information var.) Neden setTimeout("Spire.Rotator.rotate()", 5000);? Bu aynı pitfalls of eval'dan muzdarip olan yöntemi kullanmak için oldukça tarihli (kullanım dışı) bir yöntem, Douglas Crockford da dahil olmak üzere bazı JavaScript programcılarının kullanılmamasını tavsiye ettiği bir işlev.

3

Basitçe bu yerine: Bununla

Spire.Rotator.rotate().defer(5000); 

:

setTimeout(Spire.Rotator.rotate, 5000); 

setTimeout() zaman belirli bir süreden sonra bazı JavaScript kodu yürütme javascript doğal yoludur.

+0

Timeout ayarlamak için dizeleri parametre olarak kullanmayın. Geçerli ama cehennemden alıntı yapmaya eğilimli ve aynı zamanda yavaş. Bunun yerine bir işlev kullanın: 'setTimeout (Spire.Rotator.rotate, 5000)' – slebetman

+0

@slebetman Ah! Evet tabi ki. Hatırlatma için teşekkürler. :) – Alex

3

Aslında kodunuzda, defer() asla çağrılmaz. Eğer tanımlarken döndürme yöntemi varsayarsak olduğunu ne Spire.Rotator nesnesi için geçerli: infinitieth çağrısı dönüş değeri daha sonra erteleme yöntemi arayacak

rotate() calls rotate() calls rotate() calls rotate() .... [to infinity] 

aramaların sayısı infinity sonra. Ama tamamlamak için saniye sürer gerçekleşmesi için infinity çağrıları beklemek zorunda.

İhtiyacınız olan şey setTimeout().