0Pricing
Lua Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การสร้างลูปเหตุการณ์อย่างง่าย
  2. Async/Await ด้วยโคโรทีน
  3. รูปแบบคล้าย Promise
  4. I/O แบบไม่บล็อกด้วย luasocket
← กลับไปที่ Lua Academy