0Pricing
Lua Academy · Lekcja

Wzorce podobne do Promise

Proszę implementować obiekty deferred/promise za pomocą korutyn i callbacków.

Wzorce podobne do Promise to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Czym jest promise

Promise reprezentuje wartość, która będzie dostępna w przyszłości. Może znajdować się w stanie oczekującym, spełnionym (z wartością) lub odrzuconym (z błędem).

Tabela promise w Lua

Zaimplementuj minimalny promise jako tabelę zawierającą stan, wartość i listy callbacków.

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

resolve i reject

Spełnienie promise wywołuje wszystkie callbacki resolve. Odrzucenie go wywołuje wszystkie callbacki reject.

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

Łączenie za pomocą andThen

Metoda :andThen(onFulfill, onReject) zwraca nowy promise, umożliwiając łączenie operacji.

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

Promise oparty na korutynie

Połącz promise z korutynami: korutyna oczekuje na promise, wykonując yield, a callback resolve promise wznawia tę korutynę.

Promise.all

Zaczekaj na ukończenie wszystkich promise.

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

Rozstrzygnij promise na podstawie pierwszego promise, który się zakończy (spełnionego lub odrzuconego).

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

Propagowanie błędów w łańcuchach

Jeśli dowolny etap łańcucha zgłosi wyjątek, błąd jest przekazywany do kolejnego handlera odrzuceń. Nieobsłużone odrzucenia należy rejestrować na końcu łańcucha.

Promise z możliwością anulowania

Dodaj metodę :cancel(), która przełącza promise w specjalny stan anulowania i zapobiega wywoływaniu callbacków.

Leniwe promise

Leniwy promise rozpoczyna pracę dopiero po dołączeniu pierwszego andThen — jest to przydatne w przypadku opcjonalnych operacji asynchronicznych.

Kiedy używać promise, a kiedy korutyn

Promise są oparte na callbackach i można je komponować. Korutyny sprawiają, że kod asynchroniczny wygląda jak synchroniczny. W Lua promise oparte na korutynach zapewniają oba te atuty: możliwość komponowania promise i czytelność kodu synchronicznego.

Pytanie dotyczące promise

Co zwraca metoda andThen promise?

Podsumowanie: wzorce podobne do promise

Promise reprezentują oczekujące wartości i mogą znajdować się w stanie oczekującym, spełnionym lub odrzuconym. Łącz operacje za pomocą andThen. Łącz promise z korutynami, aby tworzyć kod w stylu async/await. Używaj all i race do koordynowania operacji równoległych.

Często zadawane pytania

Czy lekcja „Wzorce podobne do Promise” jest bezpłatna?

Tak — pełny tekst „Wzorce podobne do Promise” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wzorce podobne do Promise”?

Proszę implementować obiekty deferred/promise za pomocą korutyn i callbacków. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Wzorce podobne do Promise”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie prostej pętli zdarzeń
  2. Async/Await z korutynami
  3. Wzorce podobne do Promise
  4. Nieblokujące wejście-wyjście z luasocket
← Powrót do Lua Academy