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 player

Exemplo: 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 player

Tratando 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.