Async/Await ด้วยโคโรทีน
สร้างตัวช่วย async() และ await() ที่หยุดชั่วคราวและทำงานต่อในโคโรทีน
Async/Await ด้วยโคโรทีน เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
แนวคิดอะซิงก์/รอผล
อะซิงก์/รอผลคือรูปแบบการเขียนโปรแกรมที่ทำให้การดำเนินการแบบอะซิงก์ดูเหมือนโค้ดแบบทำงานตามลำดับ ใน Lua โครูทีนมีกลไก yield/resume ที่ช่วยให้สร้างรูปแบบนี้ได้อย่างเป็นธรรมชาติ
ฟังก์ชันรอผล
await(future) จะใช้ yield กับโครูทีนปัจจุบันและเก็บฟังก์ชันเรียกกลับไว้ เพื่อ resume โครูทีนเมื่อฟิวเจอร์ทำงานเสร็จ
local function await(future)
local co = coroutine.running()
future.onComplete = function(result)
coroutine.resume(co, result)
end
return coroutine.yield()
endตัวห่อหุ้มฟังก์ชันอะซิงก์
async(fn) จะห่อหุ้มฟังก์ชันเพื่อให้ฟังก์ชันนั้นทำงานในโครูทีนใหม่ที่ตัวจัดตารางเวลาควบคุม
local function async(fn)
return function(...)
local co = coroutine.create(fn)
local ok, err = coroutine.resume(co, ...)
if not ok then print("async error:", err) end
return co
end
endออบเจ็กต์ฟิวเจอร์อย่างง่าย
ฟิวเจอร์แสดงผลลัพธ์ที่ยังรอดำเนินการ เรียก complete ในภายหลัง แล้วฟิวเจอร์จะ resume โครูทีนทั้งหมดที่กำลังรออยู่
local function newFuture()
local f = {done=false, value=nil, waiters={}}
f.complete = function(val)
f.done = true; f.value = val
for _, cb in ipairs(f.waiters) do cb(val) end
end
f.andThen = function(cb)
if f.done then cb(f.value)
else f.waiters[#f.waiters+1] = cb end
end
return f
endการใช้ await ในทางปฏิบัติ
เขียนโค้ดอะซิงก์ที่ดูเหมือนทำงานตามลำดับ แต่ภายในใช้ yield และ resume
local fetchData = async(function(url)
local result = await(httpGet(url)) -- yields
local parsed = await(parseJSON(result)) -- yields again
print("Got:", parsed.name)
end)
fetchData("http://example.com/api")การส่งต่อข้อผิดพลาด
ส่งข้อผิดพลาดผ่านฟิวเจอร์ หากการดำเนินการล้มเหลว ให้ resume โครูทีนพร้อมตัวบ่งชี้ข้อผิดพลาดและข้อความข้อผิดพลาด
local function awaitSafe(future)
local co = coroutine.running()
future.onComplete = function(ok, result)
coroutine.resume(co, ok, result)
end
return coroutine.yield()
endทำงานตามลำดับเทียบกับทำงานขนาน
ใช้ await ตามลำดับสำหรับการดำเนินการที่ขึ้นต่อกัน สำหรับการดำเนินการที่ไม่ขึ้นต่อกัน ให้เริ่มโครูทีนทั้งสองแล้วรอฟิวเจอร์สำหรับรวมงาน
รูปแบบ Promise.all
เรียกใช้งานอะซิงก์หลายงานและรอให้งานทั้งหมดเสร็จสิ้นโดยใช้ฟิวเจอร์ที่มีตัวนับ
local function all(futures)
local results = {}
local count = #futures
local combined = newFuture()
for i, f in ipairs(futures) do
f:andThen(function(v)
results[i] = v
count = count - 1
if count == 0 then combined.complete(results) end
end)
end
return combined
endการยกเลิก
สร้างการยกเลิกโดยทำเครื่องหมายว่าโครูทีนถูกยกเลิกก่อน resume โครูทีนจะตรวจสอบเครื่องหมายดังกล่าวแล้วคืนค่ากลับก่อนเวลา
การผสานรวมกับอินพุต/เอาต์พุต
ผสานรวมกับอินพุต/เอาต์พุตแบบไม่บล็อก: เมื่อการเรียกใช้อินพุต/เอาต์พุตจะทำให้การทำงานหยุดรอ ให้ใช้ yield และลงทะเบียนฟังก์ชันเรียกกลับเพื่อ resume เมื่อข้อมูลพร้อมใช้งาน
เปรียบเทียบกับรูปแบบฟังก์ชันเรียกกลับ
อะซิงก์/รอผลที่ใช้โครูทีนอ่านเข้าใจได้ง่ายกว่าฟังก์ชันเรียกกลับที่ซ้อนกันอย่างมาก การจัดการข้อผิดพลาดด้วยการเรียกใช้ที่ดักจับข้อผิดพลาดก็สะอาดกว่าการส่งพารามิเตอร์ข้อผิดพลาดให้ฟังก์ชันเรียกกลับ
คำถามเรื่องอะซิงก์/รอผล
await(future) ทำอะไรในระบบอะซิงก์ที่ใช้โครูทีน
ทบทวน: อะซิงก์/รอผลด้วยโครูทีน
สร้างอะซิงก์/รอผลด้วยโครูทีนโดยห่อหุ้มการดำเนินการแบบอะซิงก์เป็นฟิวเจอร์ ซึ่งจะ resume โครูทีนที่ใช้ yield เมื่อการดำเนินการเสร็จสิ้น ผลลัพธ์คือโค้ดที่ดูเหมือนทำงานตามลำดับ แต่แท้จริงแล้วไม่บล็อกการทำงาน
คำถามที่พบบ่อย
บทเรียน “Async/Await ด้วยโคโรทีน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Async/Await ด้วยโคโรทีน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Async/Await ด้วยโคโรทีน”
สร้างตัวช่วย async() และ await() ที่หยุดชั่วคราวและทำงานต่อในโคโรทีน คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Async/Await ด้วยโคโรทีน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้างลูปเหตุการณ์อย่างง่าย
- Async/Await ด้วยโคโรทีน
- รูปแบบคล้าย Promise
- I/O แบบไม่บล็อกด้วย luasocket