2010-04-21 84 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;