الدالة jQuery.Deferred()‎‎ في jQuery

من موسوعة حسوب
< jQuery‏ | jQuery
(بالتحويل من jQuery/jQuery.Deferred)

jQuery.Deferred( [beforeStart ] )‎

القيم المعادة

تعيد كائنًا مؤجلًا من النوع Deferred.

الوصف

هذه الدالة هي دالةٌ منتجة (factory function) تعيد كائن أداةٍ قابل للتسلسل (chainable utility object) يمكن استعمال مجموعة من التوابع مع هذا الكائن لتسجيل عدَّة دوال رد نداءٍ في طوابير ردود النداء (callback queues)، واستدعاء هذه الطوابير فيما بعد، ونقل حالة النجاح (success state) أو الفشل (failure state) لأي دالة متزامنة (synchronous) أو غير متزامنة (asynchronous).

jQuery.Deferred( [beforeStart ] )‎

أُضيف مع الإصدار: 1.5.

beforeStart

دالة من الشكل Function( Deferred deferred )‎ تُستدعَى قبل إعادة الدالة البانية فقط.

تنشئ الدالة المنتجة jQuery.Deferred()‎ كائنًا مؤجَّلًا جديدًا من النوع deferred وتعيده، ويمكن أن يُمرَّر إليها اختياريًّا دالةٌ تستدعى قبل أن تعيد الدالة jQuery.Deferred()‎ الكائن؛ يمرَّر حينئذٍ هذا الكائن كوسيط إلى تلك الدالة المعطاة، ويشير this ضمنها إلى الكائن نفسه أيضًا. وتستطيع هذه الدالة المعطاة ربط ردود نداءٍ باستعمال التابع deferred.then()‎ مثلًا.

حالة الكائن Deferred البدائيَّة هي "معلَّق" (pending). توضع ردود النداء التي تضاف إلى الكائن باستعمال التوابع deferred.then()‎، أو deferred.always()‎، أو deferred.done()‎، أو deferred.fail()‎ إلى طابورٍ من أجل تنفيذها لاحقًا. ينقل استدعاء التابع deferred.resolve()‎ أو التابع deferred.resolveWith()‎ حال الكائن Deferred إلى الحالة "مقبول" (resolved) وتُنفَّذ حينئذٍ مباشرةً أية دوال doneCallbacks قد عُيِّنت. ينقل استدعاء التابع deferred.reject()‎ أو التابع deferred.rejectWith()‎ حال الكائن Deferred إلى الحالة "مرفوض" (rejected) وتُنفَّذ حينها مباشرةً أية دوال failCallback قد عُيِّنت. متى ما تغيَّرت حالة الكائن إلى "مقبول" أو "مرفوض"، فإنَّها تبقى كذلك دون تغيير. لا يزال بالإمكان إضافة ردود النداء إلى الكائن المقبول أو المرفوض، إذ ستنفَّذ حينئذٍ مباشرةً.

ردود النداء المحسَّنة مع الكائن Deferred

في JavaScript، من الشائع استدعاء الدوال التي تقبل اختياريًّا ردود نداء لتُستدعَى ضمن هذه الدالة لاحقًا. في الإصدار السابقة للإصدار jQuery 1.5 مثلًا، تقبل العمليات غير المتزامنة مثل jQuery.ajax()‎ ردود النداء لاستدعائها بعض الأحيان في المستقبل القريب بناءً على نجاح وفشل وإكمال طلب Ajax.

أضافت الدالة jQuery.Deferred()‎ عدَّة تحسينات إلى الطريقة التي تدار وتُسدعَى فيها ردود النداء مثل إضافة طرائق مرنة لتوفير ردود نداء متعدِّدة، إذ يمكن استدعاء ردود النداء تلك بغض النظر إن كانت ردود النداء المرسلة قد أنجزت مسبقًا أم لا. يعتمد الكائن Deferred في jQuery على التصميم CommonJS Promises/A.

إحدى الأمثلة المستعملة لتوضيح الكائن المؤجَّل Deferred هي تخيله وكأنه مُغلَّف يحوي دوالًا متسلسلة معروفة. تحدِّد التوابع deferred.then()‎، و deferred.always()‎، و deferred.done()‎، و deferred.fail()‎ الدوال المراد استدعاؤها، ويستدعي التابعان deferred.resolve(args)‎ و deferred.reject(args)‎ الدوال مع تمرير الوسائط التي تعطيها إياها إليها. لا تتغير حالة الكائن Deferred مرةً أخرى متى ما أصبحت "مقبول" أم "مرفوض"، إذ سيُتجاهل الاستدعاء الثاني للتابع deferred.resolve()‎ مثلًا. إن أضيفت دوال أخرى باستعمال التابع deferred.then()‎ مثلًا بعد "قبول" الكائن Deferred، فستُستدعى هذه الدوال مباشرةً مع تمرير الوسائط المعطاة مسبقًا إليها.

في أغلب الحالات التي تعيد فيها واجهات jQuery البرمجية (API) عند استدعائها كائنًا من النوع Deferred أو كائن متوافق مع الكائن Promise مثل استدعاء jQuery.ajax()، أو jQuery.when()‎، فأنت حينئذٍ بحاجة إلى استعمال التوابع deferred.then()‎، و deferred.done()‎، و deferred.fail()‎ فقط لإضافة ردود النداء إلى طوابير الكائن Deferred. سيستدعي الاستدعاء الضمني للواجهة البرمجية أو الشيفرة التي أنشأت الكائن التابع deferred.resolve()‎ أو التابع deferred.reject()‎ مع الكائن Deferred في الوقت ذاته مسبِّبةً تنفيذ ردود النداء المناسبة.

مصادر