2012-03-21 45 views

Odpowiedz

15

W kodzie ActionScript nie ma funkcji wstrzymania ani opóźnienia. Jak JavaScript, można użyć setTimeout() zamiast tak:

function trigger():void { setTimeout(doIt, 1000); } 
function doIt():void { Alert.show("done!"); } 

Po połączeniu funkcji trigger() do każdej imprezy, takie jak „click”, gdy zdarzenie alert box pojawi się po 1 sek.

Dostępne są również funkcje setInterval() i clearlnterval(), których można użyć do powtórzenia. Jednak w takim przypadku zaleca się używanie klasy flash.utils.Timer.

private var myTimer:Timer; 

private function init():void { 
    myTimer = new Timer(5000, 1); 
    myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerHandler); 
    myTimer.start(); 
} 

public function timerHandler(event:TimerEvent):void { 
    Alert.show("I was delayed!"); 
} 
+2

Zalecam wykonanie przykładu za pomocą Timera, a nie setTimeout. –

+0

dzięki za informację zwrotną, zaktualizowałem swoją odpowiedź. –

+1

FYI, jeśli musisz użyć setTimeOut, upewnij się, że wywołujesz clearTimeOut lub ryzykujesz wyciek pamięci. Jednak nie byłbym tak szybki, aby odpowiedzieć na to pytanie ... Podejrzewam, że istnieje nieporozumienie związane z asynchroniczną naturą flash/flex, które w innym przypadku mielibyśmy okazję wyjaśnić. –

2

To zawsze zależy od tego, co próbujesz zrobić.

Widzę, że używasz Flex. W Flexie jest to funkcja zwana callLater, która jest wpleciona w UIComponent. Jest podobny do setTimeout w użyciu, ale funkcja będzie automatycznie wywoływana w następnym cyklu aktualizacji zamiast ustawionego przedziału czasu. Załóżmy, że niektóre dane zostały ustawione na datagrid i co wybrać konkretną komórkę/wiersz w nim. Użyjesz callLater, aby upewnić się, że datagrid miał czas na przetworzenie danych. Oto exemple:

protected function dummy():void 
{ 
    myComponent.callLater(myFunction, ["this is a message"]) 
} 

protected function myFunction(message:String):void 
{ 
    Alert.show(message); 
} 

Jeśli chcesz tylko opóźnić egzekucję jeden raz, setTimeout jest droga. Jeśli chcesz wykonać coś więcej niż raz w określonych odstępach czasu, używaj Timera.

Jeśli ma reagować na niektóre akcje, takie jak zdalna funkcja zapisywania, sugeruję użycie zdarzeń i słuchanie czegoś takiego jak zdarzenie SAVE_COMPLETE.

+0

+1 co najmniej wspominając, że Wydarzenia są prawdopodobnie sposobem na rozwiązanie whateveer podstawowym problemem jest OP próbuje rozwiązać! –

2

W kodzie ActionScript nie ma funkcji wstrzymania. Wszystko działa w jednym wątku, więc blokowałoby to również wszystkie interakcje interfejsu użytkownika, co jest powszechnie postrzegane jako zły sposób.

Najbliższą opcją jest użycie klasy Timer, która zostanie uruchomiona tylko w danej funkcji i "odpalić" kod, który chciałeś poczekać, aż zakończy się 2 sekundy oczekiwania.

w funkcji:

private function whereWeStartTimer():void{ 
    //misc code that you always execute before starting your timer 

    var timer:Timer = new Timer(2000); // 2 second wait 
    timer.addEventListener(TimerEvent.TIMER,functionTimerFlagged); 
    timer.start(); 
} 

private function functionTimerFlagged(event:TimerEvent):void{ 
    var targetTimer:Timer = event.target as Timer; 
    targetTimer.removeEventListener(TimerEvent.TIMER,functionTimerFlagged); 
    targetTimer.stop(); 

    //put your code here that you wanted to execute after two seconds 

    //force-ably destroy timer to ensure garbage collection(optional) 
    targetTimer = null; 
} 
0

Co gdybym musiał wykonać przycisku timera jak w następującym stanie? Mam jedno zdarzenie kliknięcia mapy, które pokazuje informacje w oknie mapy. Potrzebuję pobrać informacje z DB pomiędzy. Teraz, aby wyświetlić pobrane informacje w wyskakującym okienku informacyjnym, potrzeba czasu.

Myślę, że lepiej jest wywołać uśpienie lub czasomierz pomiędzy wyskakującym okienkiem kliknięcia i informacją na mapie, aby można było wyświetlić pobrane dane.