2010-04-21 82 views
10

为flash.utils.setTimeout该文档()状态:定时器VS的setTimeout

代替使用这种方法,可以考虑 创建一个Timer对象,与 指定的时间间隔,使用1作为 repeatCount参数(它将 定时器设置为只运行一次)。

有谁知道这样做是否有(显着的)优势?当您只需要延迟1次呼叫时,使用setTimeout就容易多了。

回答

11

setTimeout实际上使用Timer子类,SetIntervalTimer,这是一个内部类。您可以通过做setTimeout(function():void { throw "booom"; }, 1);来检查。你会在堆栈跟踪中看到它。

因此,我不能看到一个很大的缺点。唯一的区别是,你有两个匿名电话而不是一个。 OTOH,在性能严重的情况下,您不应该使用任何一种(除了一个内部计时器)以避免频繁实例化TimerEvent对象。

基本上,我认为这是一个品味问题。 Adobe决定,AS3事件系统非常棒,所以他们会推广它。

0

我的理解是setTimeout在AS3中折旧。我在查找setTimeout代码的源代码时遇到了一些麻烦,但是我也相信清除对Timer对象的引用比使用setTimeout更容易(如果我从AS2中没记错的话)。

-2

setTimeout在外部.as文件中无效。

+0

喜。很高兴在这里看到你:)无论如何:你可以再详细一点吗? “外部”是什么意思? – back2dos 2010-04-21 15:17:00

+0

通过外部.as文件我的意思是类。有没有人在这里使用as3没有类? PS:我们认识对方吗? – 2010-04-22 04:06:45

+0

奇怪。无论使用IDE还是mxmlc编译,我都可以完美地工作。 PS:不是个人,而是来自haXe邮件列表。 :) – back2dos 2010-04-22 08:44:43

0

通常情况下,如果有新的更强大的方法来实现某些东西,某些东西就会被弃用。

是的setTimeout在某些情况下更容易设置,但在其他情况下更受限制。

我会使用Timer类,因为通常当某些东西被弃用时,这意味着支持可能会在将来被删除,然后您的代码将无法工作。

+0

通常是一个很好的推理,但不太可能发生在Flash Player中。 adobe真正关心向后兼容性和传统支持。在这种情况下,也可以在几行内重写该函数。 – back2dos 2010-04-21 15:33:58

+0

@ back2dos,是的,你在Adobe的情况下是正确的,但为什么不遵循一般的良好做法? – 2010-04-21 15:36:40

+0

除了Adobe的观点之外,除了setTimeout之外,还有什么比定时器更好的做法呢?我同意,'Timer'提供了更多的可能性,然后'setInterval'和'setTimer',但是再一次,AVM2字节码提供比ActionScript更多的可能性:D我认为'setTimeout'是一个有用的函数。如果它不在那里,我会自己写。对我来说,代码简洁是一种很好的做法,因为这样做会使代码变得易读易懂。所以虽然我一般都认同,但通常我们会认真对待弃用,在ActionScript 3的情况下,我经常会觉得这只是一个品味问题。 – back2dos 2010-04-22 10:47:15

0

问题是,Timer对象并不准确,并且会受到帧率波动的影响。阅读http://forums.adobe.com/message/892631。我使用Date对象创建了自己的Timer(称为RealTimer),它更准确。我建议你也这样做。

8

定时器:

  • 为您提供了更多的控制,你可以 注册多个事件监听器 接收事件,而不是一个 单一与setTimeout的

  • 您可以控制启动时间和
    重复次数(对于setTimeout不是很有用 ,因为这个
    有只运行一次,并考虑眼前的时候 它被称为)

  • 多行来写,一个
    延迟后,甚至更多,如果你 需要与参数 (自定义事件类此)来区分
  • 使用事件侦听器,这是
    as3的标准做法。
  • 简洁的外观

的setTimeout:

  • 更易于使用

  • 更少的代码编写

  • 参数可以很容易地发送;

我更喜欢Timer类,但我看过程序员经常使用setTimeout。

此外,如果使用的是补间库,一些支持延迟呼叫

例如TweenMax TweenMax.delayedCall(2,myFunction的,[ “myParam”]);

所有这些谁说的setTimeout已被弃用,这是无感..

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/package.html#setTimeout%28%29

我相信你无法看到周围的setTimeout这里任何“弃用”关键字

2

的setTimeout是在外部.as文件中工作得很好。

在类只需使用这样的:

import flash.utils.*; 
import flash.events.TimerEvent;