Async/Await باستخدام البرامج التعاونية
أنشئ أدوات المساعدة async() وawait() التي توقف البرامج التعاونية وتستأنفها
Async/Await باستخدام البرامج التعاونية درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
فكرة Async/Await
Async/await هو نموذج برمجة تبدو فيه العمليات غير المتزامنة كأنها تعليمات متزامنة. وفي Lua، توفر coroutines آلية yield/resume اللازمة لتنفيذ ذلك بصورة طبيعية.
دالة await
تُنفّذ await(future) yield لـ coroutine الحالية، وتخزّن دالة استدعاء لاحق تستأنفها عند اكتمال future.
local function await(future)
local co = coroutine.running()
future.onComplete = function(result)
coroutine.resume(co, result)
end
return coroutine.yield()
endغلاف الدالة async
تغلّف async(fn) دالةً بحيث تعمل داخل coroutine جديدة تديرها أداة الجدولة.
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كائن Future بسيط
يمثّل future نتيجةً معلّقة. أكمله لاحقًا، وعندها سيستأنف جميع coroutines المنتظرة.
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")تمرير الأخطاء
مرّر الأخطاء عبر future: إذا فشلت العملية، فاستأنف coroutine مع راية خطأ ورسالة الخطأ.
local function awaitSafe(future)
local co = coroutine.running()
future.onComplete = function(ok, result)
coroutine.resume(co, ok, result)
end
return coroutine.yield()
endتسلسلي أم متوازٍ
استخدم await بالتسلسل في العمليات المعتمدة على بعضها. أما العمليات المستقلة، فأنشئ لكل منها coroutine ثم انتظر future للضم.
نمط Promise.all
شغّل عدة مهام غير متزامنة وانتظر اكتمالها جميعًا باستخدام future وعداد.
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الإلغاء
نفّذ الإلغاء بتحديد coroutine على أنها ملغاة قبل استئنافها. وتفحص coroutine هذه الراية ثم تعود مبكرًا.
الدمج مع عمليات الإدخال والإخراج
ادمج ذلك مع عمليات الإدخال والإخراج غير الحاجزة: عندما تؤدي عملية إدخال وإخراج إلى الحجب، نفّذ yield وسجّل دالة استدعاء لاحق لاستئناف التنفيذ عند توفر البيانات.
مقارنة بأسلوب دوال الاستدعاء اللاحق
تكون Async/await مع coroutines أوضح بكثير من دوال الاستدعاء اللاحق المتداخلة. كما أن معالجة الأخطاء باستخدام pcall أنظف من تمرير معاملات الأخطاء إلى دوال الاستدعاء اللاحق.
سؤال حول Async/Await
ماذا تفعل await(future) في نظام async قائم على coroutines؟
مراجعة: Async/Await مع Coroutines
نفّذ Async/await باستخدام coroutines، وذلك بتغليف العمليات غير المتزامنة في futures تستأنف coroutine المعلّقة عند اكتمالها. والنتيجة تعليمات برمجية تبدو متسلسلة، لكنها في الواقع غير حاجزة.
الأسئلة الشائعة
هل درس «Async/Await باستخدام البرامج التعاونية» مجاني؟
نعم — نص درس «Async/Await باستخدام البرامج التعاونية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «Async/Await باستخدام البرامج التعاونية»؟
أنشئ أدوات المساعدة async() وawait() التي توقف البرامج التعاونية وتستأنفها تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Async/Await باستخدام البرامج التعاونية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- إنشاء حلقة أحداث بسيطة
- Async/Await باستخدام البرامج التعاونية
- أنماط شبيهة بالوعود
- إدخال وإخراج غير حاجب باستخدام luasocket