FiveM Callback คืออะไร ใช้อย่างไร

 FiveM Callback คือรูปแบบการเขียน Script ที่ฝั่งหนึ่งส่ง Request ไปยังอีกฝั่ง แล้วรอรับผลลัพธ์กลับมา เช่น Client ขอข้อมูลจาก Server แล้ว Server ส่งข้อมูลกลับให้ Client

ตัวอย่างแนวคิดคือ

Client
↓
Request
↓
Server
↓
ประมวลผล
↓
Response
↓
Client ได้ข้อมูลกลับ

Callback เหมาะกับระบบที่ต้องการ “ถามแล้วได้คำตอบ” เช่น

  • ขอข้อมูลรถใน Garage

  • ตรวจจำนวน Item

  • ขอข้อมูล Character

  • เช็ก Permission

  • โหลดข้อมูล Banking

  • ตรวจ Job

  • ดึงข้อมูลจาก Database

  • ขอข้อมูล Inventory

อย่างไรก็ตาม ต้องเข้าใจว่า FiveM Core ไม่มี Client ↔ Server Callback API สากลเพียงตัวเดียวที่ชื่อ RegisterCallback() แบบที่ทุก Framework ใช้เหมือนกัน

คำว่า Callback ใน FiveM สามารถหมายถึงหลายสิ่ง เช่น

Lua Callback Function
NUI Callback
Framework Callback
ox_lib Callback
Custom Request/Response

ดังนั้นก่อน Copy Code ต้องดูว่า Callback นั้นมาจาก FiveM Core, Framework หรือ Library ใด

① Callback คืออะไร

ใน Programming คำว่า Callback หมายถึง Function ที่ถูกส่งให้ Code อีกส่วนหนึ่ง แล้ว Function นั้นจะถูกเรียกเมื่อ Operation บางอย่างเสร็จ

ตัวอย่างง่าย ๆ

local function doSomething(callback)
    local result = 500

    callback(result)
end

เรียก

doSomething(function(result)
    print(result)
end)

ผลลัพธ์คือ

500

Function ที่ถูกส่งเข้าไปคือ Callback

② Callback ไม่ได้หมายถึง Client Server เสมอไป

Callback เป็น Concept ทั่วไป

ตัวอย่าง FiveM Core เองก็มี API ที่ใช้ Callback Function

เช่นบาง Export หรือ Function สามารถรับ Function ไปเรียกหลัง Operation เสร็จ

ดังนั้น

Callback
≠
Client → Server เสมอไป

แต่ใน FiveM Community เมื่อพูดว่า

Server Callback

มักหมายถึง Client ขอข้อมูลจาก Server แล้วรอผลลัพธ์กลับ

③ FiveM Callback ต่างจาก Event อย่างไร

Event ทั่วไปมักมี Flow

ส่ง Event
↓
อีกฝั่งทำงาน

เช่น

TriggerServerEvent(
    'garage:store'
)

Client ส่ง Request แล้วไม่จำเป็นต้องรอ Return Value โดยตรง

Callback มักเป็น

Request
↓
Server
↓
Response
↓
Client ใช้ Result

จึงเหมาะกับกรณีที่ต้องการผลลัพธ์กลับ

④ ตัวอย่าง Event แบบ One-way

Client

TriggerServerEvent(
    'job:start'
)

Server

RegisterNetEvent(
    'job:start',
    function()
        local src = source

        -- start job
    end
)

Client ไม่ได้รอ Result โดยตรง

นี่เป็น Event Flow

⑤ ตัวอย่าง Use Case ที่ Callback เหมาะกว่า

สมมติผู้เล่นเปิด Garage

Client ต้องรู้ว่า Player มีรถอะไรบ้าง

Flow คือ

Player เปิด Garage
↓
Client ขอรายการรถ
↓
Server
↓
Query Database
↓
ได้รายการรถ
↓
ส่ง Result กลับ
↓
Client เปิด UI

นี่คือ Request/Response

จึงเหมาะกับ Callback

⑥ FiveM Core มี Callback Client Server สำเร็จรูปไหม

FiveM Core มี Event System, NUI Callback, Function Callback และเครื่องมือ Async ต่าง ๆ

แต่ไม่มี API Client ↔ Server ตัวเดียวแบบ

FiveM.RegisterServerCallback(...)

ที่เป็นมาตรฐานเดียวสำหรับทุก Resource

ระบบที่เห็นชื่ออย่าง

ESX.RegisterServerCallback
QBCore.Functions.CreateCallback
lib.callback.register

เป็นระบบของ Framework หรือ Library นั้น ๆ

ไม่ใช่ Function เดียวกันทั้งหมดใน FiveM Core

⑦ ทำไม Framework ต้องสร้าง Callback System

เพราะ Event ดั้งเดิมเป็นระบบส่งข้อความ

เช่น

Client
↓
TriggerServerEvent
↓
Server

ถ้า Client ต้องรอ Response Developer ต้องสร้าง Flow กลับอีกทาง

Server
↓
TriggerClientEvent
↓
Client

Callback Library จึงช่วยซ่อนรายละเอียดพวก

  • Request ID

  • Response Event

  • Pending Requests

  • Timeout

  • Promise

  • Coroutine

ทำให้ Developer เขียน Code ง่ายขึ้น

⑧ Callback ทำงานภายในอย่างไร

Callback Client/Server โดยทั่วไปมี Concept ประมาณ

Client Request
↓
สร้าง Request ID
↓
ส่ง Server
↓
Server ประมวลผล
↓
ส่ง Response พร้อม Request ID
↓
Client หา Callback เดิม
↓
ส่ง Result เข้า Callback

Request ID ช่วยให้รู้ว่า Response นี้เป็นของ Request ไหน

โดยเฉพาะเมื่อมีหลาย Request พร้อมกัน

⑨ ทำไมต้องมี Request ID

สมมติ Client ขอพร้อมกัน

Request 1
→ Garage

Request 2
→ Banking

Request 3
→ Inventory

Response อาจกลับมาไม่พร้อมกัน

ระบบจึงต้องจับคู่

Request 1 ↔ Response 1
Request 2 ↔ Response 2
Request 3 ↔ Response 3

Request ID ทำหน้าที่นี้

Library Callback ส่วนใหญ่จัดการเรื่องนี้ให้ Developer แล้ว

⑩ Callback แบบ Function คืออะไร

Callback แบบพื้นฐานคือส่ง Function เข้าไป

ตัวอย่าง

local function getData(callback)
    local data = {
        money = 5000
    }

    callback(data)
end

เรียก

getData(function(data)
    print(data.money)
end)

นี่เป็น Callback แบบ Local Programming

ไม่เกี่ยวกับ Network

⑪ Async Callback คืออะไร

Callback มักถูกใช้เมื่อ Operation ไม่เสร็จทันที

เช่น

Database Query
HTTP Request
Server Request
NUI Request

แทนที่จะ Block โปรแกรมจนกว่างานจะเสร็จ ระบบจะทำงานต่อ แล้วเรียก Callback เมื่อ Result พร้อม

Concept คือ

เริ่ม Operation
↓
รอแบบ Async
↓
Operation เสร็จ
↓
เรียก Callback

⑫ ตัวอย่าง HTTP Callback ใน FiveM

FiveM Lua มี PerformHttpRequest() ซึ่งรับ Callback Function

แนวคิดเช่น

PerformHttpRequest(
    url,
    function(statusCode, body, headers, errorData)
        print(statusCode)
        print(body)
    end
)

Function ที่รับ

statusCode
body
headers
errorData

คือ Callback ที่ถูกเรียกหลัง HTTP Request เสร็จ

นี่เป็นตัวอย่าง Callback ใน FiveM Core ที่เห็น Concept ชัดมาก

⑬ Callback ต่างจาก Return อย่างไร

Function ปกติสามารถ

local function getMoney()
    return 5000
end

local money =
    getMoney()

ได้ทันที

แต่ Async Operation อาจยังไม่เสร็จ

จึงไม่สามารถคิดว่า

local result =
    asynchronousOperation()

แล้วจะได้ข้อมูลทันทีเสมอไป

Callback หรือ Promise/Await จึงถูกใช้จัดการ Result ที่มาทีหลัง

⑭ Callback Hell คืออะไร

ถ้ามี Callback ซ้อนกันมากเกินไป Code อาจกลายเป็น

Callback
└── Callback
    └── Callback
        └── Callback

เช่น

getPlayer(function(player)
    getVehicles(function(vehicles)
        getGarage(function(garage)
            -- logic
        end)
    end)
end)

Code แบบนี้อ่านและ Error Handling ยาก

จึงมี Promise/Await หรือ Callback Library สมัยใหม่มาช่วย

⑮ Await คืออะไร

Await เป็นแนวทางที่ช่วยเขียน Async Code ให้ดูเหมือน Sequential Code

Concept จาก

callback(function(result)
    use(result)
end)

เป็น

result = await callback()
use(result)

แต่ Runtime หรือ Library ต้องรองรับระบบ Await นั้น

FiveM Lua มี Citizen.Await และ Library บางตัวมี API await ของตัวเอง

⑯ ox_lib Callback คืออะไร

ox_lib มี Callback Module สำหรับสร้าง Request/Response ระหว่าง Client และ Server

ฝั่ง Server สามารถ Register Callback ด้วยแนวคิด

lib.callback.register(
    'resource:getData',
    function(source, ...)
        return result
    end
)

จากนั้นอีกฝั่งสามารถเรียก Callback ตาม API ของ ox_lib

ข้อดีคือไม่ต้องสร้าง Request ID และ Response Event ด้วยตัวเอง

⑰ lib.callback.await คืออะไร

ox_lib มีรูปแบบ

lib.callback.await

ที่ Yield Coroutine ปัจจุบันจนได้ Response

Concept เช่น

local result =
    lib.callback.await(
        'resource:getData',
        false
    )

ทำให้ Code อ่านแบบ Sequential ได้

แทนการเขียน Callback Function ซ้อนหลายชั้น

แต่ต้องใช้ ox_lib จึงจะมี API นี้

⑱ อย่า Copy lib.callback ถ้า Server ไม่มี ox_lib

ถ้า Resource เขียน

lib.callback.await(...)

แต่ Server ไม่ได้ติดตั้งหรือโหลด ox_lib

Code จะไม่ทำงาน

ดังนั้นก่อน Copy Script ต้องดูว่า Function มาจากไหน

เช่น

FiveM Core?
ESX?
QBCore?
Qbox?
ox_lib?
Custom Resource?

นี่เป็นทักษะสำคัญมากของ FiveM Developer

⑲ ESX Callback คืออะไร

ESX มีระบบ Server Callback ของ Framework เพื่อให้ Client ขอข้อมูลจาก Server และรับ Response

Concept เช่น

ESX Client
↓
Trigger Server Callback
↓
ESX Server
↓
Register Server Callback
↓
Response
↓
Client

ชื่อ API และรูปแบบที่แน่นอนควรตรวจตาม ESX Version ที่ Server ใช้

เพราะ Framework สามารถเปลี่ยน API หรือ Compatibility Layer ได้

⑳ QBCore Callback คืออะไร

QBCore ก็มี Callback System ของตัวเอง

Concept คล้ายกัน

Client
↓
TriggerCallback
↓
Server
↓
CreateCallback
↓
Return Data
↓
Client

ดังนั้น ESX Callback กับ QBCore Callback ทำ Concept คล้ายกัน แต่ Syntax และ Implementation ไม่จำเป็นต้องเหมือนกัน

㉑ Qbox Callback ใช้อะไร

Qbox Resource สมัยใหม่จำนวนมากอาจใช้ Library/API ที่ Framework หรือ ox_lib เตรียมไว้

แต่ควรตรวจ Resource และ Version ที่ใช้งานจริง

อย่าสมมติว่า

ESX syntax
=
QBCore syntax
=
Qbox syntax

เพียงเพราะเรียกทั้งหมดว่า Callback

㉒ NUI Callback คืออะไร

NUI Callback เป็นระบบ Callback อย่างเป็นทางการของ Cfx.re สำหรับให้ Web UI ติดต่อกลับเข้ามายัง Game Script

Flow คือ

NUI JavaScript
↓
fetch()
↓
NUI Callback
↓
FiveM Client Script
↓
cb(...)
↓
Response กลับ NUI

ใช้กับระบบ

  • Inventory

  • Phone

  • Banking

  • Garage

  • Admin Panel

  • Character Creator

ได้มาก

㉓ NUI Callback แตกต่างจาก Server Callback

NUI Callback อยู่ระหว่าง

Browser UI
↔
Client Script

ส่วน Server Callback มักเป็น

Client Script
↔
Server Script

ดังนั้นระบบหนึ่งอาจมี Flow

NUI
↓
NUI Callback
↓
Client
↓
Server Callback
↓
Server
↓
Database
↓
Client
↓
NUI Response

ทั้งสองระบบอาจถูกใช้ร่วมกัน

㉔ NUI Callback ใน Lua ใช้อย่างไร

ตัวอย่างแนวคิด

RegisterNUICallback(
    'getItemInfo',
    function(data, cb)

        local itemId =
            data.itemId

        cb({
            itemId = itemId,
            ok = true
        })
    end
)

NUI JavaScript ส่ง Request เข้ามา

Client รับข้อมูลแล้วเรียก

cb(...)

เพื่อ Response กลับ UI

㉕ NUI Callback ต้องเรียก cb เสมอไหม

ควรเรียกเสมอ

เอกสาร Cfx.re ระบุว่า NUI Callback ควรส่ง Response ผ่าน Callback ทุกครั้ง

ถ้าไม่เรียก cb(...) Request ฝั่ง NUI อาจค้างจน Timeout หรือเกิด Error ใน Calling fetch()

แม้ไม่มีข้อมูลก็สามารถ Response เช่น

cb({
    ok = true
})

หรือ Object ว่างตาม Use Case

㉖ NUI Callback รับข้อมูลแบบไหน

ข้อมูล POST จาก NUI จะถูก Parse จาก JSON ให้ใน Callback

ดังนั้น NUI ส่ง

itemId
amount
action

Client จะรับผ่าน data

ตัวอย่าง

local itemId =
    data.itemId

และ Response ที่ส่งผ่าน cb() ก็ต้องสามารถแปลงเป็นข้อมูลที่ NUI รับได้ตามระบบ JSON

㉗ NUI Callback ปลอดภัยไหม

ไม่ควรใช้ NUI Callback เป็น Security Boundary

NUI อยู่ Client-side

ดังนั้น Input จาก NUI ต้องถูกมองว่าเป็น Client Input

เช่น NUI ส่ง

price = 1

Client ไม่ควรส่งต่อ Server แล้ว Server เชื่อราคานั้น

Server ยังต้อง Validate

㉘ ตัวอย่าง NUI Shop Flow ที่ถูกต้อง

NUI

เลือก water x2

ส่ง Client

item = water
amount = 2

Client ส่ง Server Request

Server Callback / Event

Server ตรวจ

Item
Amount
Price
Money
Inventory
Position

จากนั้นส่ง Result กลับ

success / error

แล้ว Client Response ให้ NUI

นี่เป็น Architecture ที่เหมาะสมกว่าให้ NUI ตัดสิน Transaction

㉙ Callback Server-side ต้อง Validate Client Input ไหม

ต้อง

Callback ไม่ได้ปลอดภัยกว่า Event โดยอัตโนมัติ

ถ้า Callback เปิดให้ Client Request

Server ต้องถือว่า Client สามารถพยายามส่ง Parameter ผิดได้

เช่น

item = weapon_x
amount = 999999

ดังนั้นต้องตรวจเหมือน RegisterNetEvent()

㉚ Callback กับ Event มี Security เหมือนกันไหม

ในแง่ Trust Boundary

Client → Server

เหมือนกัน

ไม่ว่าจะเรียกว่า

Event
Callback
RPC
Request

ถ้า Input มาจาก Client Server ต้อง Validate

ชื่อ API ไม่ได้เปลี่ยนความจริงข้อนี้

㉛ Callback ควรตรวจ Type หรือไม่

ควร

ตัวอย่าง Callback รับ

itemName
amount

Server ควรตรวจ

if type(itemName) ~= 'string' then
    return nil
end

if type(amount) ~= 'number' then
    return nil
end

จากนั้นค่อยตรวจ Range และ Business Logic

㉜ Callback ควรตรวจ Range หรือไม่

ควร

เช่น

if amount < 1
or amount > 100 then
    return false
end

เพราะ Number ที่ถูก Type ไม่ได้หมายความว่าค่าถูกต้อง

㉝ Callback ควรตรวจ Permission หรือไม่

ต้องสำหรับ Action ที่ต้องมี Permission

เช่น Callback ขอข้อมูล Admin

Server ไม่ควรทำเพียง

Client บอก isAdmin=true

Server ต้องตรวจ

  • ACE

  • Framework Permission

  • Role

  • Player Data

ด้วยข้อมูล Server-side

㉞ Callback เหมาะกับการ Query Database ไหม

เหมาะมากใน Use Case ที่ Client ต้องการ Data กลับ

เช่น

Client เปิด Garage
↓
Callback
↓
Server
↓
Database
↓
Vehicles
↓
Client

แต่ไม่ควร Query Database ทุก Frame หรือทุกครั้งที่ UI Re-render

ควรออกแบบ Cache และ Refresh ตามความจำเป็น

㉟ Callback Query Database ทุก Tick ดีไหม

ไม่

ตัวอย่างที่ไม่ดี

ทุก Frame
↓
Callback Server
↓
SELECT Database

จะเพิ่มทั้ง

  • Network

  • Server CPU

  • Database Load

ถ้าข้อมูลเปลี่ยนไม่บ่อย ควรโหลดครั้งแรกแล้ว Update เมื่อ State เปลี่ยน

㊱ Callback ใช้โหลด Garage อย่างไร

Concept

Client:
ขอ vehicles

Server:
หา identifier
↓
Query database
↓
สร้าง Vehicle List
↓
Return

Client:
แสดง UI

Callback เหมาะเพราะ Client ต้องใช้ Result ก่อนสร้างรายการรถ

㊲ Callback ใช้กับ Inventory อย่างไร

ตัวอย่าง Client ต้องรู้จำนวน Item

Client
↓
callback getItemCount
↓
Server Inventory
↓
count
↓
Client

แต่ต้องถามก่อนว่า Client จำเป็นต้องรู้ข้อมูลนั้นจริงหรือไม่

ถ้า Logic สำคัญ เช่น Crafting Server สามารถตรวจ Item โดยตรงโดยไม่จำเป็นต้องส่ง Count กลับ Clientก่อน

㊳ Callback ใช้กับ Permission อย่างไร

Client อาจต้องรู้ Permission เพื่อแสดง Menu

Client
↓
Callback
↓
Server ตรวจ Permission
↓
true / false
↓
Client เปิด UI

แต่เมื่อ Player กด Action จริง Server ต้องตรวจ Permissionอีกครั้ง

อย่าใช้ Permission Result ที่ Client Cache ไว้เป็น Security Check สุดท้าย

㊴ Callback ใช้กับ Banking อย่างไร

ตัวอย่าง

Client เปิด Banking
↓
Callback
↓
Server
↓
โหลด Balance + Transactions
↓
Client
↓
NUI

สำหรับ Deposit/Withdraw จริง

Server ต้อง Validate Transaction แยกอีกครั้ง

การโหลด Balance กับการอนุมัติ Transaction เป็นคนละเรื่อง

㊵ Callback ใช้กับ Character Selection อย่างไร

Client ต้องโหลดรายการ Character

Client
↓
Callback
↓
Server
↓
Database
↓
Characters
↓
Client
↓
Character UI

นี่เป็น Use Case ที่เหมาะกับ Request/Response มาก

แต่ข้อมูลที่ส่งกลับควรมีเฉพาะ Field ที่ Client ต้องใช้

㊶ Callback Response ควรใหญ่แค่ไหน

ควรเล็กที่สุดเท่าที่เพียงพอต่อ Use Case

เช่น Garage UI ต้องการ

plate
model
label
stored
garage

ไม่จำเป็นต้องส่ง Database Row ทุก Column

ช่วยลด

  • Payload

  • Network

  • UI Complexity

  • การเปิดเผยข้อมูลเกินจำเป็น

㊷ Callback ควรมี Timeout ไหม

ระบบ Callback ที่ดีควรมีแนวคิด Timeout

เพราะ Response อาจไม่กลับมาเนื่องจาก

  • Resource Error

  • Player Disconnect

  • Server Error

  • Callback ไม่ Register

  • Event Lost/Flow ผิด

  • Dependency ไม่ทำงาน

ถ้าไม่มี Timeout Pending Request อาจค้าง

Library ที่ดีมักจัดการเรื่องนี้ให้

㊸ Callback ช้าเกิดจากอะไร

สาเหตุอาจเป็น

  • Database Query ช้า

  • Server CPU สูง

  • Network Latency

  • Handler ทำงานหนัก

  • External API ช้า

  • Resource Dependency

  • Callback Chain ซ้อนกัน

อย่าโทษ Callback API ก่อนตรวจ Operation ที่อยู่ข้างใน

㊹ Callback ทำให้ Ping สูงไหม

Callback เองไม่ได้ทำให้ Ping สูงโดยอัตโนมัติ

แต่การเรียก Callback จำนวนมากอาจเพิ่ม Network Traffic และ Server Work

เช่น

ทุก Tick
↓
Callback
↓
Server
↓
Database

เป็น Architecture ที่ไม่ดี

ใช้ Callback เมื่อจำเป็นจริง ๆ

㊺ Callback ทุก Frame ควรไหม

โดยทั่วไปไม่ควร

ถ้าต้องรู้ State แบบ Real-time อาจมีระบบอื่นที่เหมาะกว่า เช่น

  • Local State

  • Events

  • State Bags

  • Cached Data

Callback เหมาะกับ Request/Response มากกว่า Real-time Polling ทุก Frame

㊻ Callback กับ State Bag เลือกอะไร

ถ้าต้องการถามข้อมูลครั้งหนึ่ง

Callback

อาจเหมาะ

เช่น

ขอ Garage Vehicles

ถ้าต้องการ State ที่เปลี่ยนและ Replicate

State Bag

อาจเหมาะกว่า

เช่น

vehicle locked = true

เลือกตามธรรมชาติของข้อมูล

㊼ Callback กับ Event เลือกอะไร

ใช้ Event เมื่อ

ทำ Action
ไม่ต้องรอ Result โดยตรง

เช่น

job:start
vehicle:store

ใช้ Callback เมื่อ

ต้องการข้อมูลกลับ

เช่น

getVehicles
getCharacter
getPermission

เป็นแนวทางที่ช่วยให้ Architecture อ่านง่าย

㊽ Callback กับ Export เลือกอะไร

Export เหมาะเมื่อ Resource ต้องเรียก Function ของ Resource อื่นใน Context เดียวกัน

ตัวอย่าง

Server Resource A
↓
Server Export
↓
Server Resource B

Callback เหมาะกับ Async Request/Response โดยเฉพาะ Client ↔ Server

อย่าใช้ Network Callback หาก Server Resource สามารถเรียก Server Export โดยตรงได้โดยไม่ต้องผ่าน Client

㊾ Callback กับ Promise ต่างกันอย่างไร

Callback ใช้ Function เป็นตัวรับ Result

operation(function(result)
    ...
end)

Promise ให้ Object ที่จะ Resolve ในอนาคต

promise
↓
resolve(result)

จากนั้น Citizen.Await() หรือ API Await ของ Library สามารถรอ Promise ได้ใน Context ที่รองรับ

Promise/Await ช่วยลด Callback Nesting

㊿ Citizen.Await คืออะไร

FiveM Lua มี Citizen.Await

ใช้รอ Promise จน Resolve หรือ Reject

Concept เช่น

สร้าง Promise
↓
เริ่ม Async Operation
↓
resolve()
↓
Citizen.Await()
↓
ได้ Result

แต่ต้องเข้าใจ Coroutine และ Async Flow ก่อนใช้ใน Resource ใหญ่

ไม่จำเป็นต้องเปลี่ยน Callback ทุกตัวเป็น Promise

51 Callback แบบ await ดีกว่า Callback Function เสมอไหม

ไม่เสมอ

Callback Function เหมาะกับ

  • Simple Async

  • Event-driven Flow

  • API ที่ออกแบบมาแบบ Callback

Await เหมาะเมื่อ

  • ต้องทำหลาย Step ตามลำดับ

  • ต้องใช้ Result ก่อนทำบรรทัดต่อไป

  • ต้องการ Code อ่านตรงลงมา

เลือกตาม Use Case และ Library

52 ระวัง Await ใน Loop

ตัวอย่าง

Loop 100 Players
↓
Await Callback ทีละคน

อาจทำให้ Operation ช้ามากหากทุก Request ต้องรอกันเป็นลำดับ

บางงานควรทำ Concurrent หรือ Batch

อย่าใช้ await โดยคิดว่าทำให้ Performance ดีขึ้นโดยอัตโนมัติ

53 Callback Return nil ได้ไหม

ได้ตามระบบ Callback ที่ใช้

ตัวอย่าง Server ไม่พบข้อมูลอาจ Return

return nil

หรือ

return false

หรือ Structure เช่น

return {
    success = false,
    error = 'not_found'
}

การใช้ Response Structure ที่สม่ำเสมอช่วยให้ Client Handle Error ง่ายขึ้น

54 Callback Response ควรออกแบบแบบไหน

Project ใหญ่สามารถใช้

{
    success = true,
    data = ...
}

หรือ

{
    success = false,
    error = 'not_found'
}

ข้อดีคือ Client ไม่ต้องเดาว่า

nil หมายถึงอะไร
false หมายถึงอะไร
empty table หมายถึงอะไร

API Contract ชัดเจนขึ้น

55 Callback Error Handling สำคัญไหม

สำคัญมาก

Client ควรรับมือกรณี

  • Server Return nil

  • Permission Denied

  • Database Error

  • Invalid Input

  • Timeout

  • Resource Unavailable

ไม่ควรสมมติว่า Callback Success ทุกครั้ง

ตัวอย่าง Flow

Callback
↓
success?
├── yes → ใช้ data
└── no → แจ้ง Error

56 Callback ไม่ทำงานตรวจอะไร

ตรวจ

① Callback Register แล้วหรือยัง
② Callback Name ตรงไหม
③ Resource Start หรือยัง
④ Library/Framework โหลดหรือยัง
⑤ Client/Server Direction ถูกไหม
⑥ มี Error ใน Console หรือไม่
⑦ Dependency ถูก Start ก่อนหรือไม่
⑧ Callback Return Response หรือไม่
⑨ Database Query สำเร็จหรือไม่
⑩ Callback API ตรงกับ Version หรือไม่

โดยเฉพาะ Resource จาก Internet ต้องเช็ก Framework Version

57 Callback ค้างเกิดจากอะไร

สาเหตุทั่วไป

  • Server Handler ไม่ Response

  • NUI Callback ไม่เรียก cb

  • Resource Error ก่อน Return

  • Callback Name ผิด

  • Pending Request ไม่ถูก Resolve

  • Player Disconnect

  • Library Dependency หาย

NUI Callback เป็นตัวอย่างชัดเจนที่ Cfx.re ระบุว่าควรเรียก Callback Response เสมอเพื่อไม่ให้ Request ค้าง

58 Callback Security Checklist

สำหรับ Client → Server Callback ให้ตรวจ

① Client ส่งอะไรมา?
② Type ถูกไหม?
③ Range ถูกไหม?
④ Player คือใคร?
⑤ Permission ถูกไหม?
⑥ Item/Money ตรวจ Server-side หรือยัง?
⑦ Position/State ต้องตรวจไหม?
⑧ Callback ถูก Spam ได้ไหม?
⑨ Database Query หนักไหม?
⑩ Response ส่งข้อมูลเกินจำเป็นไหม?

Callback ไม่ใช่ทางลัดข้าม Security

59 มือใหม่ควรใช้ Callback เมื่อไร

เริ่มใช้กับระบบง่าย ๆ ที่ต้องการ Result

เช่น

getPlayerJob
getVehicleCount
getGarageVehicles
checkPermission

แต่อย่าใช้ Callback กับทุกอย่าง

ถ้าเพียงต้องบอก Server ว่า

ผู้เล่นกดเริ่มงาน

Event อาจเหมาะกว่า

60 หลักการจำ FiveM Callback

จำแบบง่ายที่สุดว่า

Event
=
บอกว่าอะไรเกิดขึ้น

Callback
=
ถามแล้วต้องการคำตอบ

และ

Client → Server Callback
=
ยังต้อง Validate ฝั่ง Server

ส่วน API จริงต้องดูว่า Resource ใช้

FiveM Core
ESX
QBCore
Qbox
ox_lib
Custom Callback

เพราะ Syntax ไม่เหมือนกันทั้งหมด

คำถามที่พบบ่อยเกี่ยวกับ FiveM Callback

FiveM Callback คืออะไร

คือรูปแบบ Request/Response ที่ Code ฝั่งหนึ่งส่ง Request แล้วรับ Result กลับ หรือ Function ที่ถูกเรียกหลัง Operation เสร็จ

FiveM มี RegisterServerCallback ใน Core ไหม

ไม่มี API สากลชื่อเดียวแบบ Framework Callback ทุกตัว ระบบอย่าง ESX.RegisterServerCallback, QBCore Callback หรือ lib.callback เป็น API ของ Framework/Library ที่เกี่ยวข้อง

Callback ต่างจาก Event อย่างไร

Event มักส่ง Action โดยไม่ต้องรอ Return โดยตรง ส่วน Callback เหมาะกับกรณีที่ต้องการ Result กลับ

Callback ใช้ Client ไป Server ได้ไหม

ได้ผ่านระบบ Callback ของ Framework/Library หรือ Custom Request/Response ที่ออกแบบไว้

Callback ใช้ Server ไป Client ได้ไหม

Library บางตัวรองรับ Server → Client Callback เช่นกัน ต้องดู API ของ Library

ox_lib Callback ใช้อะไร

มี API เช่น lib.callback.register, lib.callback และ lib.callback.await ตามฝั่งและ Use Case

NUI Callback คืออะไร

เป็นระบบให้ NUI Browser ส่ง Request ไปยัง Game Script แล้วรับ Response ผ่าน Callback

NUI Callback ต้องเรียก cb ไหม

ควรเรียกทุกครั้ง ไม่เช่นนั้น Request ฝั่ง UI อาจค้างและ Timeout

Callback ปลอดภัยกว่า Event ไหม

ไม่โดยอัตโนมัติ ถ้า Request มาจาก Client Server ยังต้อง Validate Input

Callback Query Database ได้ไหม

ได้และเป็น Use Case ที่พบบ่อย แต่ควร Query เมื่อจำเป็น ไม่ควร Poll ทุก Frame

Callback ทุก Tick ดีไหม

ไม่ โดยทั่วไปควรใช้ Event, Cache หรือ State Replication ที่เหมาะสมแทน

Callback กับ State Bag ต่างกันอย่างไร

Callback ใช้ Request/Response ส่วน State Bag เหมาะกับ State ที่ต้อง Replicate

Callback กับ Export ต่างกันอย่างไร

Export เหมาะกับการเรียก Function ระหว่าง Resource ใน Context เดียวกัน ส่วน Callback มักใช้ Async Request/Response รวมถึง Client ↔ Server

Callback กับ Promise ต่างกันอย่างไร

Callback รับ Result ผ่าน Function ส่วน Promise เก็บผลลัพธ์ที่จะมาภายหลังและสามารถใช้ Await ในระบบที่รองรับ

สรุป FiveM Callback คืออะไร ใช้อย่างไร

FiveM Callback คือ Concept สำหรับรับผลลัพธ์จาก Operation หรือสร้างการสื่อสารแบบ Request → Response

ตัวอย่างทั่วไปคือ

Client
↓
ขอข้อมูล
↓
Server
↓
Validate
↓
Database / Logic
↓
Return
↓
Client

เหมาะกับระบบอย่าง

Garage
Character
Inventory
Banking
Permission
Player Data
Database Query

แต่สิ่งที่ต้องเข้าใจคือ FiveM ไม่มี Server Callback API สากลตัวเดียวสำหรับทุก Framework

คุณอาจพบ

ESX Callback
QBCore Callback
Qbox / ox_lib Callback
NUI Callback
Custom Callback

ซึ่งแต่ละระบบมี Syntax ต่างกัน

ใน FiveM Core เองมี Callback Pattern ในหลาย API และมี NUI Callback อย่างเป็นทางการ ขณะที่ Library อย่าง ox_lib มี lib.callback.register และ lib.callback.await สำหรับ Request/Response ระหว่าง Client และ Server

สำหรับผู้ที่เรียน FiveM Developer กับ comsiam สิ่งสำคัญที่สุดคืออย่าจำเพียงชื่อ Function แต่ให้เข้าใจ Concept ว่า ใคร Request, ใคร Response, ข้อมูลมาจากไหน และฝั่งไหนเชื่อถือได้

โดยเฉพาะ Callback ที่ Client เรียก Server ต้องใช้หลักเดียวกับ Network Event คือ Server-side Validation เสมอ

เมื่อเข้าใจ Callback แล้ว เนื้อหาถัดไปของ comsiam จะเข้าสู่ FiveM Export คืออะไร ใช้อย่างไร ซึ่งเป็นอีกวิธีสำคัญในการให้ Resource หนึ่งเรียก Function ของอีก Resource โดยตรง

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด