Cliente y servidor a fondo · Lección 2/4 · 8 min
Callbacks a fondo y manejo de errores
Los callbacks devuelven datos del servidor. Aprende a pasar varios argumentos y a no dejar al cliente colgado.
Ya viste los callbacks en el módulo de frameworks. Aquí vamos un paso más: varios argumentos, validación y siempre responder (un callback que no llama a cb() deja al cliente esperando para siempre).
-- Servidor: devuelve si puede comprar Y cuánto le queda
ESX.RegisterServerCallback('garaje:sacarCoche', function(source, cb, plate)
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return cb(false, 0) end -- responde SIEMPRE
local coche = MySQL.single.await('SELECT * FROM owned_vehicles WHERE plate = ? AND owner = ?', { plate, xPlayer.identifier })
if not coche then return cb(false, 0) end
cb(true, xPlayer.getMoney())
end)Callback con validación
-- Cliente: recibe los dos valores
ESX.TriggerServerCallback('garaje:sacarCoche', function(ok, dinero)
if ok then
print('Coche sacado. Te quedan ' .. dinero .. '€')
else
print('Ese coche no es tuyo')
end
end, 'ABC123')Cliente
Regla: en TODOS los caminos del callback (incluidos los return tempranos) tienes que llamar a cb(). Si no, el cliente se queda colgado esperando la respuesta.
Practica lo aprendido
0/3¿Qué pasa si un ESX.RegisterServerCallback hace un 'return' temprano sin llamar a cb()?
Pista
El cliente está esperando la respuesta del callback.
Completa el callback para que responda en TODOS los caminos y devuelva el dinero del jugador.
ESX.RegisterServerCallback('garaje:sacarCoche', function(source, cb, plate) local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return (false, 0) end cb(true, xPlayer.())end)Pista
Incluso en el return temprano hay que llamar a cb(); el saldo se lee con getMoney().
Este callback deja al cliente colgado cuando el jugador no existe. Arréglalo para que responda en ese camino con cb(false).
Este código tiene un fallo:
ESX.RegisterServerCallback('licencia:tiene', function(source, cb) local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return end cb(true)end)Reescríbelo corregido:
Pista
Cambia 'return end' por 'return cb(false) end'.
Reto: prográmalo tú
Escribe un callback que compruebe si el jugador tiene una licencia (en BD) y devuelva true/false + el nombre de la licencia.
Escríbelo tú en tu editor (VS Code) y pruébalo en tu servidor. Aquí se aprende haciéndolo, no copiando.
Ver pista
MySQL.single.await + cb en cada return, también en el caso de error.
Escribe aquí tu solución:
