Funkcja
await
Czeka w zadaniu async na wynik. Przyjmuje dwie formy. Pierwsza to funkcja-starter: dostaje resume i uruchamia coś, co kończy się callbackiem (zapytanie dbQuery, fetchRemote, timer). Gdy callback wywoła resume(...), await zwraca te same wartości. Druga forma to inne zadanie z async: await czeka, 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 przez pcall).
Składnia
var await(function, task starter [, var ...])Argumenty
starterfunction, task- Funkcja
function(resume, ...)albo zadanie zasync. ...var, opcjonalny = nil- Dodatkowe argumenty przekazane starterowi po
resume.
Zwraca
Wartości przekazane do resume albo wyniki zadania.
Przykład
local db = dbConnect("sqlite", "gracze.db")
addCommandHandler("pieniadze", function(player)
async(function()
local qh = await(function(resume)
dbQuery(resume, db, "SELECT money FROM gracze WHERE nick = ?", getPlayerName(player))
end)
local rows = dbPoll(qh, 0)
local money = rows and rows[1] and rows[1].money or 0
outputChatBox("Masz $" .. money, player)
end)
end)
Uwagi
Tylko w zadaniu. Poza async funkcja zgłasza błąd only allowed inside async. Kolejne wywołania tego samego resume są ignorowane, a resume wywołane od razu w starterze też działa.
Zobacz też
asyncUruchamia 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.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.