Lua Academy · leksjon

Async/await med coroutine-er

Opprett async()- og await()-hjelpefunksjoner som setter coroutine-er på pause og gjenopptar dem.

Leksjon 2 av 413 trinn

Async/await med coroutine-er er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Ideen bak async/await

async/await er en programmeringsmodell der asynkrone operasjoner ser ut som synkron kode. I Lua tilbyr korutiner mekanismen for å gi fra seg kontroll og gjenoppta kjøringen, slik at dette kan implementeres på en naturlig måte.

await-funksjon

await(future) lar den aktuelle korutinen gi fra seg kontroll og lagrer en callback som gjenopptar den når future-objektet er ferdig.

local function await(future)
  local co = coroutine.running()
  future.onComplete = function(result)
    coroutine.resume(co, result)
  end
  return coroutine.yield()
end

Wrapper for async-funksjoner

async(fn) pakker inn en funksjon slik at den kjører i en ny korutine som administreres av planleggeren.

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

Enkelt future-objekt

En future representerer et resultat som fortsatt venter. Fullfør den senere, så gjenopptar den alle ventende korutiner.

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 i praksis

Skriv asynkron kode som ser sekvensiell ut, men som internt gir fra seg kontroll og gjenopptar kjøringen.

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")

Feilvidereføring

Send feil gjennom future-objektet: Hvis operasjonen mislykkes, gjenopptar du korutinen med et feilflagg og feilmeldingen.

local function awaitSafe(future)
  local co = coroutine.running()
  future.onComplete = function(ok, result)
    coroutine.resume(co, ok, result)
  end
  return coroutine.yield()
end

Sekvensielt eller parallelt

Bruk await i rekkefølge for avhengige operasjoner. For uavhengige operasjoner starter du begge korutinene og venter på en join-future.

Promise.all-mønsteret

Kjør flere asynkrone oppgaver, og vent til alle er fullført ved hjelp av en future med en teller.

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

Kansellering

Implementer kansellering ved å merke korutinen som kansellert før den gjenopptas. Korutinen kontrollerer flagget og avslutter tidlig.

Integrasjon med I/O

Integrer med ikke-blokkerende I/O: Når et I/O-kall ville blitt blokkert, lar du korutinen gi fra seg kontroll og registrerer en callback som gjenopptar den når data er tilgjengelige.

Sammenligning med callback-stil

async/await med korutiner er langt mer lesbart enn nøstede callbacks. Feilhåndtering med pcall er også ryddigere enn feilparametere i callbacks.

Async/await-spørsmål

Hva gjør await(future) i et asynkront system som er basert på korutiner?

Oppsummering: Async/await med korutiner

Implementer async/await med korutiner ved å pakke asynkrone operasjoner inn som futures som gjenopptar korutinen som ga fra seg kontroll, når operasjonen er fullført. Resultatet er kode som ser sekvensiell ut, men som faktisk ikke blokkerer.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Async/await med coroutine-er» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Async/await med coroutine-er», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Async/await med coroutine-er»?

Opprett async()- og await()-hjelpefunksjoner som setter coroutine-er på pause og gjenopptar dem. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Async/await med coroutine-er»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Bygge en enkel hendelsesløkke
  2. Async/await med coroutine-er
  3. Promise-lignende mønstre
  4. Ikke-blokkerende I/O med luasocket
← Tilbake til Lua Academy