2010-11-19 91 views
1

.defer(5000)在JavaScript中導致too much recursion錯誤。我如何延遲執行5秒?如何在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); 
    } 
} 

回答

5

這整條生產線:

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

是錯誤的。由於rotate後面的括號,你的函數會立即調用它自己(無限遞歸)。刪除括號將解決這個問題,但代碼可能無法正常工作。要修復代碼,使用瀏覽器的window.setTimeout method,它接受一個函數和一個延遲(以毫秒爲單位)的兩個參數:

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

爲什麼不setTimeout(Spire.Rotator.rotate, 5000);?原因是該函數中的this將是window而不是Spire.Rotator。 (網上有關於這個的plenty of information。)爲什麼不是setTimeout("Spire.Rotator.rotate()", 5000);?這是一種相當過時(不贊成使用)的方法,使用的方法會遭受相同的pitfalls of eval,這是包括Douglas Crockford建議不使用的一些JavaScript程序員的功能。

3

可以替換爲這樣:

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

有了這個:

setTimeout(Spire.Rotator.rotate, 5000); 

setTimeout()是在指定的時間量後,執行JavaScript代碼的JavaScript的原生方式。

+0

不要使用字符串作爲setTimeout的參數。這是有效的,但容易引用地獄,也很慢。改用一個函數:'setTimeout(Spire.Rotator.rotate,5000)' – slebetman 2010-11-19 03:20:04

+0

@slebetman啊!當然是。感謝您的提醒。 :) – Alex 2010-11-19 03:21:35

3

實際上,在你的代碼中,defer()永遠不會被調用。假設你定義旋轉的方法是由Spire.Rotator對象發生的事情是:

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

infinity電話號碼infinitieth調用的返回值,隨後將調用延遲方法。但是您必須等待infinity呼叫才能完成,需要eternity秒才能完成。

你需要的是setTimeout()