Chcę, aby mój kod poczekał kilka sekund przed wykonaniem. Czy jest jakaś funkcja podobna do snu w flexie?Czy w funkcji flex występuje funkcja spania?
Odpowiedz
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!");
}
Zalecam wykonanie przykładu za pomocą Timera, a nie setTimeout. –
dzięki za informację zwrotną, zaktualizowałem swoją odpowiedź. –
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ć. –
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.
+1 co najmniej wspominając, że Wydarzenia są prawdopodobnie sposobem na rozwiązanie whateveer podstawowym problemem jest OP próbuje rozwiązać! –
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;
}
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.
[Timer] (http://help.adobe.com/pl/FlashPlatform/reference/actionscript/3/flash/utils/Timer.html) – RIAstar