Lua Academy · Oppitunti

Promise-tyyppiset rakenteet

Toteuttakaa deferred-/promise-oliot korutiinien ja takaisinkutsujen avulla.

Oppitunti 3/413 vaihetta

Promise-tyyppiset rakenteet on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.

Mikä on promise?

Promise edustaa arvoa, joka on saatavilla myöhemmin. Sen tila voi olla pending, fulfilled (arvon kanssa) tai rejected (virheen kanssa).

Lua-promise-taulukko

Toteuttakaa yksinkertainen promise taulukkona, joka sisältää tilan, arvon ja takaisinkutsulistat.

local function newPromise()
  return {
    state    = "pending",
    value    = nil,
    _resolve = {},
    _reject  = {},
  }
end

resolve ja reject

Promisen täyttäminen kutsuu kaikkia resolve-takaisinkutsuja. Sen hylkääminen kutsuu kaikkia reject-takaisinkutsuja.

local function resolve(p, value)
  if p.state ~= "pending" then return end
  p.state = "fulfilled"; p.value = value
  for _, cb in ipairs(p._resolve) do cb(value) end
end
local function reject(p, reason)
  if p.state ~= "pending" then return end
  p.state = "rejected"; p.value = reason
  for _, cb in ipairs(p._reject) do cb(reason) end
end

andThen-ketjutus

:andThen(onFulfill, onReject)-metodi palauttaa uuden promisen, mikä mahdollistaa ketjutuksen.

function promise:andThen(onFulfill, onReject)
  local next = newPromise()
  self._resolve[#self._resolve+1] = function(v)
    local ok, result = pcall(onFulfill, v)
    if ok then resolve(next, result)
    else reject(next, result) end
  end
  if onReject then
    self._reject[#self._reject+1] = function(e)
      local ok, result = pcall(onReject, e)
      if ok then resolve(next, result)
      else reject(next, result) end
    end
  end
  return next
end

Coroutineen perustuva promise

Yhdistäkää promiset coroutineihin: coroutine odottaa promisea yieldaamalla, ja promisen resolve-takaisinkutsu resuumailee sen.

Promise.all

Odottakaa, että useat promiset valmistuvat kaikki.

local function all(promises)
  local results = {}
  local count = #promises
  local combined = newPromise()
  for i, p in ipairs(promises) do
    p:andThen(function(v)
      results[i] = v; count = count - 1
      if count == 0 then resolve(combined, results) end
    end, function(e) reject(combined, e) end)
  end
  return combined
end

Promise.race

Ratkaiskaa promise sen promisen perusteella, joka valmistuu ensimmäisenä (täytettynä tai hylättynä).

local function race(promises)
  local combined = newPromise()
  for _, p in ipairs(promises) do
    p:andThen(
      function(v) resolve(combined, v) end,
      function(e) reject(combined, e) end
    )
  end
  return combined
end

Virheiden välittäminen ketjuissa

Jos jokin ketjun vaihe heittää virheen, virhe välittyy seuraavalle rejection-käsittelijälle. Käsittelemättömät hylkäykset on kirjattava ketjun lopussa.

Peruutettavat promiset

Lisätkää :cancel()-metodi, joka siirtää promisen erityiseen peruutettuun tilaan ja estää takaisinkutsujen suorittamisen.

Laiskat promiset

Lazy promise aloittaa työnsä vasta, kun ensimmäinen andThen liitetään siihen — tämä on hyödyllistä valinnaisissa asynkronisissa operaatioissa.

Milloin promiset kannattaa valita coroutinejen sijaan

Promiset perustuvat takaisinkutsuihin ja ovat yhdisteltäviä. Coroutinet saavat asynkronisen koodin näyttämään synkroniselta. Luassa coroutine-pohjaiset promiset tarjoavat molemmat: promisejen yhdisteltävyyden ja synkronisen koodin luettavuuden.

Promise-kysymys

Mitä promisen andThen-metodi palauttaa?

Kertaus: Promise-tyyppiset mallit

Promiset edustavat valmistumista odottavia arvoja, joiden tilat ovat pending, fulfilled ja rejected. Ketjuttakaa operaatiot andThen-metodilla. Yhdistäkää promiset coroutineihin async/await-tyylistä koodia varten. Käyttäkää all- ja race-toimintoja rinnakkaisen koordinoinnin toteuttamiseen.

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 ”Promise-tyyppiset rakenteet” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Promise-tyyppiset rakenteet”. 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 ”Promise-tyyppiset rakenteet”?

Toteuttakaa deferred-/promise-oliot korutiinien ja takaisinkutsujen avulla. 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 3/4.

Kuinka kauan ”Promise-tyyppiset rakenteet”-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