Async/Await z korutynami
Proszę tworzyć pomocnicze funkcje async() i await(), które zawieszają i wznawiają korutyny.
Async/Await z korutynami to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Idea async/await
Async/await to model programowania, w którym operacje asynchroniczne wyglądają jak kod synchroniczny. W Lua korutyny zapewniają mechanizm yield/resume, dzięki któremu można naturalnie zaimplementować ten model.
Funkcja await
await(future) zawiesza bieżącą korutynę i przechowuje callback, który wznowi ją po ukończeniu future.
local function await(future)
local co = coroutine.running()
future.onComplete = function(result)
coroutine.resume(co, result)
end
return coroutine.yield()
endObudowa funkcji async
async(fn) opakowuje funkcję, aby działała w nowej korutynie zarządzanej przez planistę.
local function async(fn)
return function(...)
local co = coroutine.create(fn)
local ok, err = coroutine.resume(co, ...)
if not ok then print("async error:", err) end
return co
end
endProsty obiekt future
Future reprezentuje oczekujący wynik. Uzupełnij go później, a wznowi wszystkie oczekujące korutyny.
local function newFuture()
local f = {done=false, value=nil, waiters={}}
f.complete = function(val)
f.done = true; f.value = val
for _, cb in ipairs(f.waiters) do cb(val) end
end
f.andThen = function(cb)
if f.done then cb(f.value)
else f.waiters[#f.waiters+1] = cb end
end
return f
endawait w praktyce
Napisz kod asynchroniczny wyglądający na sekwencyjny, który wewnętrznie wykonuje yield i jest wznawiany.
local fetchData = async(function(url)
local result = await(httpGet(url)) -- yields
local parsed = await(parseJSON(result)) -- yields again
print("Got:", parsed.name)
end)
fetchData("http://example.com/api")Propagowanie błędów
Przekazuj błędy przez future: jeśli operacja się nie powiedzie, wznów korutynę z flagą błędu i komunikatem błędu.
local function awaitSafe(future)
local co = coroutine.running()
future.onComplete = function(ok, result)
coroutine.resume(co, ok, result)
end
return coroutine.yield()
endSekwencyjnie a równolegle
Używaj await sekwencyjnie w przypadku operacji zależnych od siebie. W przypadku operacji niezależnych uruchom obie korutyny i użyj await dla future sygnalizującego ich wspólne ukończenie.
Wzorzec Promise.all
Uruchom wiele zadań asynchronicznych i zaczekaj na ich ukończenie, używając future z licznikiem.
local function all(futures)
local results = {}
local count = #futures
local combined = newFuture()
for i, f in ipairs(futures) do
f:andThen(function(v)
results[i] = v
count = count - 1
if count == 0 then combined.complete(results) end
end)
end
return combined
endAnulowanie
Zaimplementuj anulowanie, oznaczając korutynę jako anulowaną przed jej wznowieniem. Korutyna sprawdza tę flagę i wcześniej kończy działanie.
Integracja z I/O
Zintegruj rozwiązanie z nieblokującym I/O: gdy wywołanie I/O mogłoby zablokować działanie, wykonaj yield i zarejestruj callback, który wznowi korutynę, gdy dane będą dostępne.
Porównanie ze stylem callbacków
Async/await z korutynami jest znacznie czytelniejsze niż zagnieżdżone callbacki. Obsługa błędów za pomocą pcall jest również przejrzystsza niż przekazywanie parametrów błędów do callbacków.
Pytanie dotyczące async/await
Co robi await(future) w systemie asynchronicznym opartym na korutynach?
Podsumowanie: async/await z korutynami
Zaimplementuj async/await za pomocą korutyn, opakowując operacje asynchroniczne jako future, które po ukończeniu wznawiają zawieszoną korutynę. W rezultacie kod wygląda na sekwencyjny, choć w rzeczywistości nie blokuje działania.
Często zadawane pytania
Czy lekcja „Async/Await z korutynami” jest bezpłatna?
Tak — pełny tekst „Async/Await z korutynami” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Async/Await z korutynami”?
Proszę tworzyć pomocnicze funkcje async() i await(), które zawieszają i wznawiają korutyny. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Async/Await z korutynami”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Tworzenie prostej pętli zdarzeń
- Async/Await z korutynami
- Wzorce podobne do Promise
- Nieblokujące wejście-wyjście z luasocket