Funkcja
async
Uruchamia funkcję jako zadanie (korutynę). Kod w zadaniu biegnie od razu, aż do pierwszego czekania (sleep, await, waitForEvent). Wtedy oddaje sterowanie, a serwer i gra działają dalej. Gdy czekanie się skończy, zadanie rusza od miejsca, w którym stanęło. Dzięki temu kroki rozłożone w czasie (odliczanie, zapytanie do bazy, odpowiedź HTTP, czekanie na gracza) piszesz po kolei, bez zagnieżdżonych callbacków i timerów.
Składnia
task async(function fn [, var ...])Argumenty
fnfunction- Funkcja zadania.
...var, opcjonalny = nil- Argumenty przekazane do funkcji.
Zwraca
Zadanie (sprawdzisz je przez getTaskStatus), albo false przy złym argumencie.
Przykład
addCommandHandler("odliczanie", function(player)
async(function()
for i = 3, 1, -1 do
outputChatBox(i .. "...", player)
sleep(1000)
end
outputChatBox("Start!", player)
end)
end)
Uwagi
Zadanie należy do zasobu. Timery i uchwyty, na które czeka zadanie, należą do zasobu, który je uruchomił. Zatrzymanie zasobu kończy więc także jego czekające zadania.
Błąd w zadaniu nie wywraca skryptu. Trafia do konsoli jako async: ..., a zadanie dostaje stan failed. Kod, który nie oddaje sterowania przez 5 sekund, zostaje przerwany (ochrona przed nieskończoną pętlą). Po stronie klienta nie liczy się czas, w którym funkcja czeka na grę (np. pod ekranem ładowania przy wejściu na serwer).
Zobacz też
awaitCzeka w zadaniuasyncna wynik. Przyjmuje dwie formy. Pierwsza to funkcja-starter: dostajeresumei uruchamia coś, co kończy się callbackiem (zapytaniedbQuery,fetchRemote, timer). Gdy callback wywołaresume(...),awaitzwraca te same wartości. Druga forma to inne zadanie zasync:awaitczeka, aż się skończy, i zwraca jego wyniki, a jeśli zadanie skończyło się błędem, rzuca ten błąd dalej (złapiesz go przezpcall).sleepWstrzymuje zadanieasyncna podany czas. W tym czasie reszta skryptów, serwer i gra działają normalnie.sleep(0)czeka do następnej klatki serwera (tak jaksetTimerz interwałem 0).waitForEventWstrzymuje zadanieasyncdo chwili, gdy zajdzie zdarzenie. Zwraca elementsourcezdarzenia i jego argumenty. Z limitem czasu zwracafalse, gdy zdarzenie nie zaszło na czas. Uchwyt i timer limitu są usuwane po zakończeniu czekania.getTaskStatusZwraca stan zadania zasync:"running"(czeka albo działa),"done"(skończone) albo"failed"(błąd). Po stanie zwraca wyniki zwrócone przez funkcję zadania albo, przy"failed", komunikat błędu.isTaskSprawdza, czy wartość jest zadaniem zwróconym przezasync.