Pular para o conteúdo

Futures

Resultados de operações assíncronas. Futures sao retornados por funcs.async() e chamadas async de contract.

Não e um módulo carregavel. Futures sao criados por operações assíncronas:

local funcs = require("funcs")
local future, err = funcs.async("app.compute:task", data)

Obter channel para receber resultado:

local ch = future:response()
local payload, ok = ch:receive()
if ok then
local result = payload:data()
end

channel() e um alias para response().

Verificação não-bloqueante se future completou:

if future:is_complete() then
local result, err = future:result()
end

Verificar se cancel() foi chamado:

if future:is_canceled() then
print("Operation was canceled")
end

Obter resultado em cache (não-bloqueante):

local val, err = future:result()

Retorna:

  • Não completo: nil, nil
  • Cancelado: nil, error (tipo CANCELED)
  • Erro: nil, error
  • Sucesso: Payload, nil ou table, nil (multiplos payloads)

Obter erro se future falhou:

local err, has_error = future:error()
if has_error then
print("Failed:", err:message())
end

Retorna: error, boolean

Cancelar operação assíncrona (best-effort):

future:cancel()

A operação ainda pode completar se ja estiver em andamento.

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()
}
-- Cancelar o mais lento
if r.channel == f1:channel() then
f2:cancel()
else
f1:cancel()
end
return r.value:data()
CondiçãoTipo
Operação canceladaCANCELED
Operação async falhouvaria