Async/Await
Sistema assíncrono para operações que precisam esperar
O Lazuli suporta programação assíncrona para operações que precisam aguardar resultados, como delays, requisições HTTP e operações de banco de dados.
Funções Async
Use async para criar funções assíncronas:
async function countdown():
send "3..."
await delay(1 second)
send "2..."
await delay(1 second)
send "1..."
await delay(1 second)
send "GO!"Await
Use await para esperar o resultado de operações assíncronas:
async function fetchData() -> object:
await delay(1 second) # Simula delay de rede
return { "status": "ok", "data": [1, 2, 3] }
async function processData():
$result = await fetchData()
send "Status: %$result.status%"Promise.all
Execute múltiplas operações assíncronas em paralelo:
async function parallel_tasks():
$results = await Promise.all([
fetchData(),
loadConfig(),
checkDatabase()
])
send "All tasks completed!"Execução Paralela
Promise.all executa todas as operações simultaneamente e espera todas terminarem antes de continuar. Isso é mais rápido que executar em sequência.Promise.race
Retorna o resultado da primeira operação a completar:
async function timeout_request():
$result = await Promise.race([
fetchData(),
delay(5 seconds, "timeout")
])
if $result == "timeout":
send "Request timed out!"Exemplo: HTTP Request
async function check_player_online(name: text):
$response = await http_get("https://api.example.com/player/%{name}%")
if $response.status == 200:
return $response.data.online
else:
return false
on join:
$is_known = await check_player_online(player's name)
if $is_known:
send "Welcome back!" to playerExemplo: Confirmação
async function confirm_action(player: player, message: text) -> boolean:
send "%{message}% (type 'yes' or 'no')" to {player}
$response = await wait_for_chat({player}, 30 seconds)
if $response is not set:
send "Timed out!" to {player}
return false
return $response contains "yes"
command /delete-home:
trigger:
if {home::%player's uuid%} is not set:
send "You don't have a home!" to player
stop
$confirmed = await confirm_action(player, "Delete your home?")
if $confirmed:
delete {home::%player's uuid%}
send "Home deleted!" to player
else:
send "Cancelled!" to playerTratando Erros
async function safe_fetch():
try:
$data = await fetchData()
return $data
catch $error:
log "Error: %$error%"
return null
async function process():
$result = await safe_fetch()
if $result is null:
send "Failed to fetch data"
stop
send "Got: %$result%"Cuidado
Operações assíncronas podem demorar. Sempre considere timeouts e tratamento de erros para evitar que scripts fiquem travados indefinidamente.