0Pricing
Lua Academy · درس

أنماط شبيهة بالوعود

نفّذ كائنات التأجيل والوعود باستخدام البرامج التعاونية ودوال الاستدعاء

أنماط شبيهة بالوعود درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.

ما الوعد؟

يمثّل promise قيمةً ستتوفر في المستقبل. ويمكن أن تكون معلّقة، أو مكتملة بنجاح (مع قيمة)، أو مرفوضة (مع خطأ).

جدول Promise في Lua

نفّذ promise بسيطًا على شكل جدول يضم الحالة والقيمة وقوائم دوال الاستدعاء اللاحق.

local function newPromise()
  return {
    state    = "pending",
    value    = nil,
    _resolve = {},
    _reject  = {},
  }
end

resolve وreject

يؤدي إكمال promise بنجاح إلى استدعاء جميع دوال resolve اللاحقة. أما رفضه فيؤدي إلى استدعاء جميع دوال reject اللاحقة.

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) promise جديدًا، مما يتيح إنشاء تسلسلات.

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

Promise مدعوم بـ Coroutine

ادمج promises مع coroutines: تنتظر coroutine ‏promise بتنفيذ yield، ثم تستأنفها دالة resolve اللاحقة الخاصة بـ promise.

Promise.all

انتظر اكتمال عدة promises جميعًا.

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

أكمل التنفيذ باستخدام أول promise يكتمل، سواء اكتمل بنجاح أو رُفض.

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

تمرير الأخطاء في التسلسلات

إذا طرأ خطأ في أي خطوة من التسلسل، ينتقل الخطأ إلى معالج الرفض التالي. ويجب تسجيل حالات الرفض غير المعالجة في نهاية التسلسل.

Promises قابلة للإلغاء

أضف طريقة :cancel() تنقل promise إلى حالة خاصة هي الإلغاء، مما يمنع تشغيل دوال الاستدعاء اللاحق.

Promises كسولة

لا يبدأ promise الكسول عمله إلا عند إرفاق أول andThen به — وهو مفيد للعمليات غير المتزامنة الاختيارية.

متى تُستخدم Promises بدلًا من Coroutines

تعتمد Promises على دوال الاستدعاء اللاحق وقابلة للتركيب. أما Coroutines فتجعل التعليمات البرمجية غير المتزامنة تبدو متزامنة. وفي Lua، تمنح promises المدعومة بـ coroutines الميزتين: قابلية تركيب promises وسهولة قراءة التعليمات المتزامنة.

سؤال حول Promise

ماذا تعيد طريقة andThen الخاصة بـ promise؟

مراجعة: أنماط شبيهة بـ Promise

تمثّل Promises قيمًا معلّقة، مع حالات معلّقة ومكتملة بنجاح ومرفوضة. اربط العمليات باستخدام andThen. وادمجها مع coroutines لإنشاء تعليمات برمجية بأسلوب async/await. استخدم all وrace للتنسيق المتوازي.

الأسئلة الشائعة

هل درس «أنماط شبيهة بالوعود» مجاني؟

نعم — نص درس «أنماط شبيهة بالوعود» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «أنماط شبيهة بالوعود»؟

نفّذ كائنات التأجيل والوعود باستخدام البرامج التعاونية ودوال الاستدعاء تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟

لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «أنماط شبيهة بالوعود»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟

نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء حلقة أحداث بسيطة
  2. Async/Await باستخدام البرامج التعاونية
  3. أنماط شبيهة بالوعود
  4. إدخال وإخراج غير حاجب باستخدام luasocket
← العودة إلى Lua Academy