Skip to content

الفرق بين الوعود والكولباك في الجافاسكريبت (Promises vs Callbacks)

الفرق بين الوعود والكولباك في الجافاسكريبت (Promises vs Callbacks)

25 أكتوبر 2015 | 00:00

إذا كنت مبرمج جافاسكريبت محترف فمن المؤكد أنه سبق لك أن عملت بدوال الإجابة Callbacks وفي بعض الحالات تكون مجبرا على استعمال دالة إجابة داخل دالة إجابة داخل دالة إجابة وهكذا (بالخصوص عند التعامل مع أوامر غير متزامنة Asynchronous كعمليات الأجاكس والتعامل مع الملفات وقواعد البيانات إلخ…) حتى تحصل على شفرة برمجية هرمية الشكل ومعقدة نسبيا كما سترى في الكود التالي :

function isUserTooYoung(id, callback) { openDatabase(function(db) { getCollection(db, ‘users’, function(col) { find(col, {‘id’: id},function(result) { result.filter(function(user) { callback(user.age < 18) } } } } }

الدالة isUserTooYoung تمكننا من التأكد من كون مستعمل معين راشد (يفوق عمره 18 سنة)، ولهذا يتم ربط الإتصال بقاعدة البيانات، ثم البحث عن المستعمل المراد معرفة عمره وفي الأخير نقوم بالتأكد من العمر.

استعمال الوعود Promises

استعمال الوعود Promises سنرى بأنه يعطينا شفرة برمجية أوضح وأبسط وأكثر دلالية، فكل دالة تنتظر جوابا تتوفر على الدالة then التي تلتقط الإجابة من الدالة التي قبلها وتمررها للدالة الثانية بداخلها، وبهذه المفهوم أصبح بإمكاننا إعادة كتابة الكود السابق بطريقة مغايرة أكثر أناقة كما يلي :

function isUserTooYoung(id) { return openDatabase(db) .then(getCollection) .then(find.bind(null, {‘id’: id})) .then(function(user) { return user.age < 18; }); }

هذا كود في Node.js ولكن الفكرة والعملية تظل صحيحة بالنسبة للتطبيقات الأخرى للجافاسكريبت.

بالتأكيد الآن أصبح الكود أكثر وضوحا بالنسبة لكم وأسهل من حيث الفهم، حيث يمكننا القول بأن الدالة openDatabase وعدت الدالة getCollection بالتوصل بمعطيات معينة Datas بعد نجاح الإتصال بقاعدة البيانات، ولو أردنا  استعمال الدالة isUserTooYoung في برنامجنا بعد ذلك فسيكون بهذه الطريقة :

isUserTooYoung(id) .then(function(result) { // هنا يمكنك التعامل مع النتيجة النهائيةresult }

لا تنسى أن هناك دوالا أخرى مفيدة عند استعمال الوعود في الجافاسكريبت مثل دالة catch التي يتم استدعاؤها عند عدم نجاح إحدى العمليات أو الوعود.

هناك العديد من المكتبات التي تمكننا من العمل بالوعود Promises بسهولة وفعالية أكبر لعل أشهرها :

ترجمة بتصرف للمقال : Taming the Pyramid of Doom

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