0Pricing
Lua Academy · Урок

Шаблоны, подобные обещаниям

Реализуйте отложенные объекты и объекты-обещания с помощью сопрограмм и обратных вызовов.

«Шаблоны, подобные обещаниям» — бесплатный урок 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
end

Promise.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 — локальная установка не требуется.

Все уроки этого курса

  1. Создание простого цикла событий
  2. Асинхронность и ожидание с сопрограммами
  3. Шаблоны, подобные обещаниям
  4. Неблокирующий ввод-вывод с luasocket
← Назад к Lua Academy