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

lua
-- 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

lua
-- 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
Test

¿Qué pasa si un ESX.RegisterServerCallback hace un 'return' temprano sin llamar a cb()?

Pista

El cliente está esperando la respuesta del callback.

Rellena los huecos

Completa el callback para que responda en TODOS los caminos y devuelva el dinero del jugador.

1ESX.RegisterServerCallback('garaje:sacarCoche', function(source, cb, plate)
2 local xPlayer = ESX.GetPlayerFromId(source)
3 if not xPlayer then return (false, 0) end
4 cb(true, xPlayer.())
5end)
Pista

Incluso en el return temprano hay que llamar a cb(); el saldo se lee con getMoney().

Corrige el error

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:

1ESX.RegisterServerCallback('licencia:tiene', function(source, cb)
2 local xPlayer = ESX.GetPlayerFromId(source)
3 if not xPlayer then return end
4 cb(true)
5end)

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:

¿Qué tal esta lección?