2010-11-19 15 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の直後にかっこが付いているため、関数は直ちに繰り返し呼び出します(無限再帰)。かっこを削除すると問題は解決しますが、コードはうまく機能しません。コードを修正するには、使用する2つの引数としての機能と遅延(ミリ秒)を受け入れ、ブラウザのwindow.setTimeout method、:

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

なぜだけではなくsetTimeout(Spire.Rotator.rotate, 5000);?その理由は、その機能のthisSpire.Rotatorではなくwindowであるためです。 (これについては、インターネット上に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

+0

@slebetmanああ!はい、もちろん。念押し有難う。 :) – Alex

3

実際、あなたのコードでは、defer()は呼び出されません。あなたが定義している回転方法を仮定すると何が起こるかであるSpire.Rotatorオブジェクトのためである:infinitiethコールの戻り値が、その後延期メソッドを呼び出します

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

コール数infinity後。しかし、完了するのにeternity秒かかるinfinityコールが発生するのを待たなければなりません。

setTimeout()が必要です。

関連する問題