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 = {},
}
endresolve 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
endPromise 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
endPromise.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
endPropagowanie 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
- Tworzenie prostej pętli zdarzeń
- Async/Await z korutynami
- Wzorce podobne do Promise
- Nieblokujące wejście-wyjście z luasocket