รูปแบบคล้าย Promise
สร้างออบเจกต์ deferred/promise ด้วยโคโรทีนและฟังก์ชันเรียกกลับ
รูปแบบคล้าย Promise เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
โพรมีสคืออะไร
โพรมีสแสดงค่าที่จะพร้อมใช้งานในอนาคต โพรมีสอาจอยู่ในสถานะ รอดำเนินการ เสร็จสมบูรณ์ (พร้อมค่า) หรือ ถูกปฏิเสธ (พร้อมข้อผิดพลาด)
ตารางโพรมีสใน Lua
สร้างโพรมีสอย่างง่ายเป็นตารางที่มีสถานะ ค่า และรายการฟังก์ชันเรียกกลับ
local function newPromise()
return {
state = "pending",
value = nil,
_resolve = {},
_reject = {},
}
endการทำให้สำเร็จและการปฏิเสธ
การทำให้โพรมีสสำเร็จจะเรียกฟังก์ชันเรียกกลับสำหรับการทำให้สำเร็จทั้งหมด ส่วนการปฏิเสธโพรมีสจะเรียกฟังก์ชันเรียกกลับสำหรับการปฏิเสธทั้งหมด
local function resolve(p, value)
if p.state ~= "pending" then return end
p.state = "fulfilled"; p.value = value
for _, cb in ipairs(p._resolve) do cb(value) end
end
local function reject(p, reason)
if p.state ~= "pending" then return end
p.state = "rejected"; p.value = reason
for _, cb in ipairs(p._reject) do cb(reason) end
endการเชื่อมต่อด้วย andThen
เมธอด :andThen(onFulfill, onReject) จะคืนค่าโพรมีสใหม่ ทำให้เชื่อมต่อการดำเนินการเป็นสายต่อเนื่องได้
function promise:andThen(onFulfill, onReject)
local next = newPromise()
self._resolve[#self._resolve+1] = function(v)
local ok, result = pcall(onFulfill, v)
if ok then resolve(next, result)
else reject(next, result) end
end
if onReject then
self._reject[#self._reject+1] = function(e)
local ok, result = pcall(onReject, e)
if ok then resolve(next, result)
else reject(next, result) end
end
end
return next
endโพรมีสที่ทำงานร่วมกับโครูทีน
ผสานโพรมีสเข้ากับโครูทีน: โครูทีนจะรอโพรมีสด้วยการใช้ yield และฟังก์ชันเรียกกลับสำหรับการทำให้สำเร็จของโพรมีสจะ resume โครูทีนนั้น
Promise.all
รอให้โพรมีสหลายรายการเสร็จสิ้นทั้งหมด
local function all(promises)
local results = {}
local count = #promises
local combined = newPromise()
for i, p in ipairs(promises) do
p:andThen(function(v)
results[i] = v; count = count - 1
if count == 0 then resolve(combined, results) end
end, function(e) reject(combined, e) end)
end
return combined
endPromise.race
ทำให้เสร็จสมบูรณ์ด้วยโพรมีสรายการแรกที่เสร็จสิ้น ไม่ว่าจะสำเร็จหรือถูกปฏิเสธ
local function race(promises)
local combined = newPromise()
for _, p in ipairs(promises) do
p:andThen(
function(v) resolve(combined, v) end,
function(e) reject(combined, e) end
)
end
return combined
endการส่งต่อข้อผิดพลาดในสายต่อเนื่อง
หากขั้นตอนใดในสายต่อเนื่องทำให้เกิดข้อผิดพลาด ข้อผิดพลาดนั้นจะถูกส่งต่อไปยังตัวจัดการการปฏิเสธถัดไป ควรบันทึกการปฏิเสธที่ไม่ได้จัดการไว้เมื่อสิ้นสุดสายต่อเนื่อง
โพรมีสที่ยกเลิกได้
เพิ่มเมธอด :cancel() ที่เปลี่ยนสถานะเป็นสถานะยกเลิกพิเศษ เพื่อป้องกันไม่ให้ฟังก์ชันเรียกกลับทำงาน
โพรมีสแบบประเมินเมื่อจำเป็น
โพรมีสแบบประเมินเมื่อจำเป็นจะเริ่มทำงานก็ต่อเมื่อมีการเชื่อมต่อ andThen รายการแรก ซึ่งมีประโยชน์สำหรับการดำเนินการแบบอะซิงก์ที่อาจไม่ต้องทำ
ควรใช้โพรมีสหรือโครูทีนเมื่อใด
โพรมีสอิงฟังก์ชันเรียกกลับและสามารถนำมาประกอบต่อกันได้ โครูทีนทำให้โค้ดอะซิงก์ดูเหมือนโค้ดแบบทำงานตามลำดับ ใน Lua โพรมีสที่ทำงานร่วมกับโครูทีนจึงให้ข้อดีทั้งสองแบบ ได้แก่ ความสามารถในการประกอบต่อกันของโพรมีสและความอ่านง่ายของโค้ดแบบทำงานตามลำดับ
คำถามเรื่องโพรมีส
เมธอด andThen ของโพรมีสคืนค่าอะไร
ทบทวน: รูปแบบคล้ายโพรมีส
โพรมีสแสดงค่าที่รอดำเนินการและมีสถานะรอดำเนินการ เสร็จสมบูรณ์ หรือถูกปฏิเสธ เชื่อมต่อการดำเนินการด้วย andThen ผสานโพรมีสเข้ากับโครูทีนเพื่อสร้างโค้ดรูปแบบอะซิงก์/รอผล ใช้ all และ race เพื่อประสานงานแบบขนาน
คำถามที่พบบ่อย
บทเรียน “รูปแบบคล้าย Promise” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบคล้าย Promise” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบคล้าย Promise”
สร้างออบเจกต์ deferred/promise ด้วยโคโรทีนและฟังก์ชันเรียกกลับ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบคล้าย Promise” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างลูปเหตุการณ์อย่างง่าย
- Async/Await ด้วยโคโรทีน
- รูปแบบคล้าย Promise
- I/O แบบไม่บล็อกด้วย luasocket