0Pricing
Lua Academy · Lektion

Promise-ähnliche Muster

Implementieren Sie Deferred-/Promise-Objekte mit Coroutinen und Callbacks

Promise-ähnliche Muster ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Promise?

Ein Promise steht für einen Wert, der in Zukunft verfügbar sein wird. Es kann sich im Zustand pending, fulfilled (mit einem Wert) oder rejected (mit einem Fehler) befinden.

Lua-Promise-Tabelle

Implementieren Sie ein minimales Promise als Tabelle mit Status, Wert und Callback-Listen.

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

resolve und reject

Beim Erfüllen eines Promises werden alle resolve-Callbacks aufgerufen. Beim Zurückweisen werden alle reject-Callbacks aufgerufen.

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-Verkettung

Eine Methode :andThen(onFulfill, onReject) gibt ein neues Promise zurück und ermöglicht dadurch Verkettungen.

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

Coroutine-gestütztes Promise

Verbinden Sie Promises mit Coroutines: Eine Coroutine wartet auf ein Promise, indem sie einen Yield ausführt, und der resolve-Callback des Promises setzt sie fort.

Promise.all

Warten Sie, bis mehrere Promises vollständig abgeschlossen sind.

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

Schließen Sie das erste Promise ab, das beendet wird (erfüllt oder zurückgewiesen).

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

Fehlerweitergabe in Verkettungen

Wenn ein Schritt in einer Verkettung einen Fehler auslöst, wird dieser an den nächsten Reject-Handler weitergegeben. Nicht behandelte Rejections sollten am Ende der Verkettung protokolliert werden.

Abbrechbare Promises

Fügen Sie eine Methode :cancel() hinzu, die in einen speziellen Abbruchstatus wechselt und verhindert, dass Callbacks ausgelöst werden.

Lazy Promises

Ein Lazy Promise beginnt seine Arbeit erst, wenn das erste andThen angehängt wird – nützlich für optionale asynchrone Operationen.

Wann Sie Promises statt Coroutines verwenden sollten

Promises basieren auf Callbacks und lassen sich gut kombinieren. Coroutines lassen asynchronen Code synchron aussehen. In Lua bieten coroutine-gestützte Promises beides: die Kombinierbarkeit von Promises und die Lesbarkeit von synchronem Code.

Promise-Frage

Was gibt die Methode andThen eines Promises zurück?

Zusammenfassung: Promise-ähnliche Muster

Promises stehen für ausstehende Werte und können den Status pending, fulfilled oder rejected haben. Verketten Sie Operationen mit andThen. Kombinieren Sie sie mit Coroutines für Code im Async/Await-Stil. Verwenden Sie all und race zur parallelen Koordination.

Häufig gestellte Fragen

Ist die Lektion „Promise-ähnliche Muster“ kostenlos?

Ja — der vollständige Text von „Promise-ähnliche Muster“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Promise-ähnliche Muster“?

Implementieren Sie Deferred-/Promise-Objekte mit Coroutinen und Callbacks Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Promise-ähnliche Muster“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Eine einfache Ereignisschleife erstellen
  2. Async/Await mit Coroutinen
  3. Promise-ähnliche Muster
  4. Nicht blockierende E/A mit luasocket
← Zurück zu Lua Academy