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 ไม่เรียก
cbResource 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
Post a Comment