Lua Academy · Lektion

Promise-lignende mønstre

Implementér deferred-/promise-objekter ved hjælp af coroutiner og callbacks.

Lektion 3 af 413 trin

Promise-lignende mønstre er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad er et løfte?

Et løfte repræsenterer en værdi, der bliver tilgængelig i fremtiden. Det kan være afventende, opfyldt (med en værdi) eller afvist (med en fejl).

Lua-løftetabel

Implementér et minimalt løfte som en tabel med tilstand, værdi og lister over callbacks.

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

resolve og reject

Når et løfte opfyldes, kaldes alle resolve-callbacks. Når det afvises, kaldes alle reject-callbacks.

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

Kædning med andThen

Metoden :andThen(onFulfill, onReject) returnerer et nyt løfte, så du kan kæde handlinger.

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

Løfte understøttet af en coroutine

Kombinér løfter med coroutines: En coroutine afventer et løfte ved at give kontrollen tilbage, og løftets resolve-callback genoptager den.

Promise.all

Vent på, at flere løfter alle bliver fuldført.

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

Fuldfør med det første løfte, der afsluttes (opfyldt eller afvist).

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

Videregivelse af fejl i kæder

Hvis et trin i en kæde kaster en fejl, videregives fejlen til den næste handler for afvisninger. Afvisninger, der ikke håndteres, bør logges i slutningen af kæden.

Annullerbare løfter

Tilføj en :cancel()-metode, der skifter til en særlig annulleret tilstand og forhindrer callbacks i at blive kaldt.

Dovne løfter

Et dovent løfte starter først arbejdet, når det første andThen tilknyttes — det er nyttigt til valgfrie asynkrone handlinger.

Hvornår skal du bruge løfter kontra coroutines?

Løfter er callback-baserede og kan sammensættes. Coroutines får asynkron kode til at ligne synkron kode. I Lua giver løfter understøttet af coroutines begge dele: løfternes mulighed for sammensætning og synkron kodes læsbarhed.

Spørgsmål om løfter

Hvad returnerer et løftes andThen-metode?

Opsummering: Løftelignende mønstre

Løfter repræsenterer værdier, der afventer, med tilstandene afventende, opfyldt og afvist. Kæd handlinger med andThen. Kombinér dem med coroutines for kode i async/await-stil. Brug all og race til parallel koordinering.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Promise-lignende mønstre” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Promise-lignende mønstre”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Promise-lignende mønstre”?

Implementér deferred-/promise-objekter ved hjælp af coroutiner og callbacks. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Promise-lignende mønstre”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Opbygning af en simpel event loop
  2. Async/await med coroutiner
  3. Promise-lignende mønstre
  4. Ikkeblokkerende I/O med luasocket
← Tilbage til Lua Academy