Futures
Futures
Заголовок раздела «Futures»Результаты асинхронных операций. Futures возвращаются funcs.async() и асинхронными вызовами контрактов.
Загрузка
Заголовок раздела «Загрузка»Не загружаемый модуль. Futures создаются асинхронными операциями:
local funcs = require("funcs")local future, err = funcs.async("app.compute:task", data)Канал ответа
Заголовок раздела «Канал ответа»Получить канал для получения результата:
local ch = future:response()local payload, ok = ch:receive()if ok then local result = payload:data()endchannel() — псевдоним для response().
Проверка завершения
Заголовок раздела «Проверка завершения»Неблокирующая проверка завершённости future:
if future:is_complete() then local result, err = future:result()endПроверка отмены
Заголовок раздела «Проверка отмены»Проверить, был ли вызван cancel():
if future:is_canceled() then print("Operation was canceled")endПолучение результата
Заголовок раздела «Получение результата»Получить закэшированный результат (неблокирующий):
local val, err = future:result()Возвращает:
- Не завершён:
nil, nil - Отменён:
nil, error(kindCANCELED) - Ошибка:
nil, error - Успех:
Payload, nilилиtable, nil(множественные payloads)
Получение ошибки
Заголовок раздела «Получение ошибки»Получить ошибку если future завершился неудачей:
local err, has_error = future:error()if has_error then print("Failed:", err:message())endВозвращает: error, boolean
Отменить асинхронную операцию (best-effort):
future:cancel()Операция может всё равно завершиться, если уже выполняется.
Паттерн таймаута
Заголовок раздела «Паттерн таймаута»local future = funcs.async("app.compute:slow", data)local timeout = time.after("5s")
local r = channel.select { future:channel():case_receive(), timeout:case_receive()}
if r.channel == timeout then future:cancel() return nil, errors.new("TIMEOUT", "Operation timed out")end
return r.value:data()Первый завершившийся
Заголовок раздела «Первый завершившийся»local f1 = funcs.async("app.cache:get", key)local f2 = funcs.async("app.db:get", key)
local r = channel.select { f1:channel():case_receive(), f2:channel():case_receive()}
-- Отменить более медленныйif r.channel == f1:channel() then f2:cancel()else f1:cancel()end
return r.value:data()| Условие | Kind |
|---|---|
| Операция отменена | CANCELED |
| Асинхронная операция не удалась | varies |