Lua Academy · Oppitunti

Async/await korutiineilla

Luokaa async()- ja await()-apufunktiot, jotka keskeyttävät ja jatkavat korutiineja.

Oppitunti 2/413 vaihetta

Async/await korutiineilla on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Async/await-ajatus

Async/await on ohjelmointimalli, jossa asynkroniset operaatiot näyttävät synkroniselta koodilta. Luassa coroutinet tarjoavat tähän luonnollisen yield/resume-mekanismin.

await-funktio

await(future) yieldaa nykyisen coroutinen ja tallentaa takaisinkutsun, joka resuumailee sen, kun future valmistuu.

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

async-funktiokuori

async(fn) käärii funktion niin, että se suoritetaan uudessa ajastimen hallinnoimassa coroutinessa.

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

Yksinkertainen future-objekti

Future edustaa vielä valmistumatonta tulosta. Viimeistelkää se myöhemmin, jolloin se resuumailee kaikki odottavat coroutinet.

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 käytännössä

Kirjoittakaa näennäisesti peräkkäistä asynkronista koodia, joka sisäisesti yieldaa ja resuumailee.

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

Virheiden välittäminen

Välittäkää virheet futuren kautta: jos operaatio epäonnistuu, resumatkaa coroutine virhelipun ja virheilmoituksen kanssa.

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

Peräkkäin vai rinnakkain

Käyttäkää await-kutsua peräkkäin toisistaan riippuvaisiin operaatioihin. Riippumattomissa operaatioissa käynnistäkää molemmat coroutinet ja odottakaa join-futurea.

Promise.all-malli

Suorittakaa useita asynkronisia tehtäviä ja odottakaa niiden kaikkien valmistumista laskurifuturen avulla.

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

Peruuttaminen

Toteuttakaa peruutus merkitsemällä coroutine peruutetuksi ennen sen resumaamista. Coroutinen on tarkistettava lippu ja palattava heti.

I/O-integraatio

Integroikaa mukaan ei-estävä I/O: kun I/O-kutsu estyisi, yieldatkaa ja rekisteröikää takaisinkutsu, joka resuumailee coroutinen, kun dataa on saatavilla.

Vertailu callback-tyyliin

Coroutinejen async/await-koodi on huomattavasti luettavampaa kuin sisäkkäiset takaisinkutsut. Myös virheenkäsittely pcall-kutsulla on selkeämpää kuin takaisinkutsujen virheparametrien käyttö.

Async/await-kysymys

Mitä await(future) tekee coroutine-pohjaisessa async-järjestelmässä?

Kertaus: Async/await coroutineilla

Toteuttakaa async/await coroutineilla käärimällä asynkroniset operaatiot futureiksi, jotka resuumailevat yieldanneen coroutinen valmistuessaan. Tuloksena on peräkkäiseltä näyttävää koodia, joka ei todellisuudessa estä suoritusta.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Async/await korutiineilla” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Async/await korutiineilla”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Async/await korutiineilla”?

Luokaa async()- ja await()-apufunktiot, jotka keskeyttävät ja jatkavat korutiineja. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Async/await korutiineilla”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Yksinkertaisen tapahtumasilmukan rakentaminen
  2. Async/await korutiineilla
  3. Promise-tyyppiset rakenteet
  4. Estämätön I/O luasocketilla
← Takaisin: Lua Academy