2010-11-19 88 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()