0Pricing
Lua Academy · Lekcja

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()
end

Obudowa 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
end

Prosty 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
end

await 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()
end

Sekwencyjnie 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
end

Anulowanie

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

  1. Tworzenie prostej pętli zdarzeń
  2. Async/Await z korutynami
  3. Wzorce podobne do Promise
  4. Nieblokujące wejście-wyjście z luasocket
← Powrót do Lua Academy