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

รูปแบบคล้าย 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
end

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

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

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