لماذا يحتوي وعد jQuery على الدالة done()، بينما وعد جافاسكريبت الموثَّق من قبل موزيلا لا يحتوي عليها؟ ماذا إذا أردت وجود دالة done() في JS؟
ما هي الاختلافات بين وعود جافا سكريبت الخاصة بموزيلا (انظر صفحة واجهة برمجة التطبيقات) ووعود jQuery (انظر صفحة واجهة برمجة التطبيقات)؟
يبدو أن وعد Mozilla يحتوي فقط على طريقتين: then و catch. يبدو أن وعد jQuery يحتوي على المزيد من الطرق، بما في ذلك: then و done و fail. (من هنا)
لماذا لا يحتوي واجهة برمجة تطبيقات JS على موزيلا على done()؟ ماذا لو أردت أن يكون لدي وظيفة done() في جافاسكريبت؟ ماذا أفعل؟
الإجابة رقم 1
وعود جافا سكريبت من موزيلا مبنية على معيار ES6، في حين أن وعود jQuery كانت شيئًا تم إنشاؤه قبل إصدار ES6.
استنادًا إلى قراءتي لوثائق jQuery، فإن then في ES6 يعادل done في jQuery.
في الواقع، هناك الكثير من مكتبات الوعد، ولكن بالنسبة لي فإن مكتبة ES6 هي الأبسط للفهم. لا تحتاج إلى أكثر من "then" و "catch" ومن السهل جدًا ربطها معًا في سلسلة من العمليات. أضف إلى ذلك Promise.all للمهام المتوازية وسيغطي ذلك 99٪ مما تحتاج إليه.
return doSomething().then(function(result) {
return doSomethingElse(result);
}).then(function(secondResult) {
return doThirdSomething(secondResult);
}).catch(function(err) {
console.log(err);
}).then(function(finalResult) {
// a then after a catch is like a "finally" or "always"
return finalResult;
});
بعض الأشياء التي يدعمها jQuery والتي ليست موجودة في ES6 هي نوع من حل "التقدم".
الإجابة رقم 2
واجهة برمجة التطبيقات المؤجلة في jQuery ضخمة وتسبق مكتبات الوعود. بمجرد أن أدركوا مدى فائدة الوعود، أضافوا طريقة then (أو سابقًا، pipe)، ومع ذلك فشلوا في تنفيذها بشكل صحيح بنسبة 100%.
كيف يكون أن واجهة برمجة جافا سكريبت على موزيلا لا تحتوي على
done()؟
إنه غير ضروري تمامًا. كل تطبيقات Promises/A+ المتوافقة (والتي تشمل ES6) تحتاج فقط إلى طريقة واحدة: .then(). إنها عالمية تمامًا، يمكنك فعل كل شيء بها - إنها الأساس الأولي للوعود.
ماذا لو أردت أن يكون لدي وظيفة
done()في جافاسكريبت؟ ماذا أفعل؟
حسنًا، يمكنك تنفيذها بنفسك:
Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) …
this.then(cb).then(null, function(err) { /* ignore */ });
return this;
};
ولكن كما ترى من ذلك، فهو ليس مفيدًا جدًا في الواقع. فهو لا يربط العمليات، ويتجاهل الاستثناءات، لذا يجب عليك ببساطة استخدام then في كل مكان.
