Async/await med coroutine-er
Opprett async()- og await()-hjelpefunksjoner som setter coroutine-er på pause og gjenopptar dem.
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()
endWrapper 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
endEnkelt 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
endawait 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()
endSekvensielt 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
endKansellering
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.
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
- Bygge en enkel hendelsesløkke
- Async/await med coroutine-er
- Promise-lignende mønstre
- Ikke-blokkerende I/O med luasocket