Шаблоны, подобные обещаниям
Реализуйте отложенные объекты и объекты-обещания с помощью сопрограмм и обратных вызовов.
«Шаблоны, подобные обещаниям» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое промис
Промис представляет значение, которое станет доступно в будущем. Он может находиться в состоянии ожидания, выполнения (со значением) или отклонения (с ошибкой).
Таблица промиса в Lua
Реализуйте минимальный промис как таблицу с состоянием, значением и списками обратных вызовов.
local function newPromise()
return {
state = "pending",
value = nil,
_resolve = {},
_reject = {},
}
endВыполнение и отклонение
Перевод промиса в выполненное состояние вызывает все обратные вызовы разрешения. Отклонение промиса вызывает все обратные вызовы отклонения.
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
Метод :andThen(onFulfill, onReject) возвращает новый промис, позволяя выстраивать цепочки.
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.all
Дождитесь полного завершения нескольких промисов.
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
Завершите выполнение с первым промисом, который будет завершён — выполнен или отклонён.
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Передача ошибок в цепочках
Если на каком-либо шаге цепочки возникает исключение, ошибка передаётся следующему обработчику отклонения. Необработанные отклонения следует записывать в журнал в конце цепочки.
Отменяемые промисы
Добавьте метод :cancel(), который переводит промис в специальное состояние отмены и не позволяет обратным вызовам выполняться.
Ленивые промисы
Ленивый промис начинает работу только после добавления первого andThen — это удобно для необязательных асинхронных операций.
Когда использовать промисы, а когда корутины
Промисы основаны на обратных вызовах и допускают композицию. Корутины позволяют асинхронному коду выглядеть синхронным. В Lua промисы на основе корутин дают оба преимущества: возможность композиции промисов и понятность синхронного кода.
Вопрос о промисах
Что возвращает метод andThen промиса?
Повторение: шаблоны, подобные промисам
Промисы представляют ожидающие значения и могут находиться в состояниях ожидания, выполнения или отклонения. Объединяйте операции в цепочки с помощью andThen. Объединяйте промисы с корутинами для создания кода в стиле асинхронности и ожидания. Используйте all и race для координации параллельных операций.
Часто задаваемые вопросы
Урок «Шаблоны, подобные обещаниям» бесплатный?
Да — полный текст урока «Шаблоны, подобные обещаниям» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблоны, подобные обещаниям»?
Реализуйте отложенные объекты и объекты-обещания с помощью сопрограмм и обратных вызовов. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Шаблоны, подобные обещаниям»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание простого цикла событий
- Асинхронность и ожидание с сопрограммами
- Шаблоны, подобные обещаниям
- Неблокирующий ввод-вывод с luasocket