عند استخدام jQuery ، كنت أعلم أن الوعد هو وسيلة لوضع البرمجة غير المتزامن JS ، لكنني لم أفهم الفرق بينه وبين كائن JQuery المؤجل. مع تقدم مشروع الشركة ، يتعين علينا تلقي بيانات من الواجهة الخلفية ، لذلك قررنا إنجازها.
يعد
Promise هو وضع يدير الأحداث غير المتزامنة في شكل عمليات متزامنة ، وتجنب طبقة من الطبقة من التعشيش ، ويمكن أن تعمل أحداث غير متزامنة في السلاسل.
نحن نعلم أنه عند كتابة الكود غير المتزامن JavaScript ، فإن رد الاتصال هو أسهل آلية ، ولكن إذا كنت تستخدم هذه الآلية ، فيجب عليك التضحية بالتحكم في التدفق ، والتعامل مع الاستثناءات ، وحتى الدلالات ، وحتى دعنا نقع في حفرة رد الاتصال ، ووعد يحل هذه المشكلة.
في ES6 ، AngularJS المدمجة المدمجة Q في الوعد ، AngularJs ، وعندما يستخدمون الوعود/المواصفات ، على النحو التالي:
كل مهمة لها ثلاث ولايات: معلقة ، وفشلت ، وفشلت.
1. حالة الإنفاق: يمكنك الانتقال إلى حالة الوفاء أو الرفض.
2. حالة Fullfiled: لا يمكن تغييرها إلى أي حالة أخرى ، ولا يمكن تغيير الحالة ، ويجب أن تكون هناك قيمة قيمة.
3. حالة مرور: لا يمكن تغييرها إلى أي دولة أخرى ، ولا يمكن تغيير الدولة ، يجب أن يكون هناك سبب.
نقل الدولة لمرة واحدة. بمجرد الوفاء بالدولة (مكتملة) أو فشلت (فشل/رفض) ، لا يمكن تغييرها بعد الآن.
نسخة الكود كما يلي:
وظيفة OKTOGREET (الاسم) {
اسم الإرجاع === 'Robin Hood' ؛
}
وظيفة ASYNCGREET (الاسم) {
var مؤلف = $ q.defer () ؛
setTimeout (function () {
// نظرًا لأن هذه الوظيفة غير المتزامنة يتم تنفيذ FN في المستقبل بشكل غير متزامن ، فإننا نلف الرمز في مكالمة $ ، مع مراقبة التغيير بشكل صحيح في النموذج
$ scope. $ application (function () {
deferred.notify ('على وشك التحية' + name + '.') ؛
if (oktogreet (name)) {
deferred.resolve ('hello ،' + name + '!') ؛
} آخر {
efferred.reject ('Meturing' + name + 'غير مسموح به.') ؛
}
}) ؛
} ، 1000) ؛
العودة المؤجلة.
}
var promise = asyncgreet ('Robin Hood') ؛
Promise.Then (وظيفة (تحية) {
تنبيه ('النجاح:' + تحية) ؛
} ، وظيفة (سبب) {
تنبيه ('فشل:' + سبب) ؛
} ، وظيفة (تحديث) {
تنبيه ('حصلت على إشعار:' + تحديث) ؛
}) ؛
الاستخدام الأساسي للوعد Q
يوضح الرمز أعلاه دور عدة طرق للحالات المدمجة التي تم بناؤها بواسطة $ Q.Defer (). إذا نجحت العملية غير المتزامنة ، يتم تغيير حالة كائن الوعد إلى "النجاح" (أي من المعلق إلى حل) ؛ إذا فشلت العملية غير المتزامنة ، يتم تغيير الحالة إلى "فشلت" (على سبيل المثال ، من المعلق إلى رفض). أخيرًا ، Return Deferred.Promise ويمكننا سلسلة الاتصال بالطريقة التي كانت آنذاك.
سيكون لدى JS وعدًا أصليًا ، وهناك بالفعل أشياء وعد في ES6 ، ويتم تنفيذ واجهة برمجة تطبيقات الوعد الأساسية في إصدارات Firefox و Chrome 32 بيتا.
$ Q.Defferd في AngularJS
إرجاع الكائن المنكوب ليتم استدعاؤه بالسلاسل عن طريق الاتصال بالاتصال $ Q.Defferd. يربط هذا الكائن حالات المهمة الثلاث في الوعود/المواصفات من خلال واجهة برمجة التطبيقات.
API deffered
طريقة الكائن المنفصل
1.Resolve (القيمة): عند حل الإعلان () ، يشير إلى أن كائن الوعد يتغير من الحالة المعلقة إلى حل.
2. تراجع (سبب): عند حل الإعلان () ، يشير إلى أن كائن الوعد يتغير من الحالة المعلقة إلى الرفض.
3. لا توجد (قيمة): في الإعلان الإخطار () ، يشير إلى أنه يمكن استدعاء الحالة غير المليئة بكائن الوعد عدة مرات قبل حلها أو رفضها.
خصائص الكائن المنفصلة
الوعد: آخر شيء يرجع هو خاصية جديدة مؤجلة للكائن ، وليس الكائن المؤجل الأصلي. لا يمكن لكائن الوعد الجديد أن يلاحظ حالة كائن الوعد الأصلي ، ولا يمكنه تعديل الحالة الداخلية للكائن المؤجل ، والتي يمكن أن تمنع تعديل حالة المهمة خارجيًا.
وعد API
عند إنشاء مثيل مؤجل ، يتم إنشاء كائن وعد جديد ويمكن الحصول على المرجع من خلال predred.promise.
الغرض من كائن الوعد هو السماح للجزء المعني بالحصول على نتائج التنفيذ عند اكتمال المهمة المؤجلة.
طرق الوعد
1. ثم (ErrorHandler ، MonvisedHandler ، ProgressHandler): يتم استخدام الطريقة ثم للاستماع إلى حالات مختلفة من الوعد. يستمع ErrorHandler إلى الحالة الفاشلة ، ويستمع اللاعب الواجب إلى الحالة التي تم الوفاء بها ، ويستمع ProgressHandler إلى حالة لم تتحقق. بالإضافة إلى ذلك ، يمكن استدعاء رد الاتصال على 0 إلى عدة مرات ، مما يوفر مؤشرا للتقدم قبل حل أو رفض (حل ورفض).
2. Catch (errorcallback) - اختصار للوعد.
3. أخيرًا (رد الاتصال) - يتيح لك مراقبة ما إذا كان يتم تنفيذ الوعد أو رفضه ، لكنك لا تحتاج إلى تعديل القيمة الأخيرة. يمكن استخدام هذا لتحرير الموارد أو تنظيف الأشياء عديمة الفائدة ، بغض النظر عما إذا كان الوعد قد تم رفضه أو حله. لمزيد من المعلومات ، يرجى الرجوع إلى مواصفات الوثائق الكاملة.
يمكن تنفيذ استدعاء سلسلة الوعد من خلال طريقة Then ().
نسخة الكود كما يلي:
PromiseB = promisea.then (وظيفة (النتيجة) {
نتيجة العودة + 1 ؛
}) ؛
// سيتم معالجة الوعد فورًا بعد معالجة الوعاء ،
// وقيمة قيمتها هي نتيجة لزيادة الوعاء بمقدار 1
طرق أخرى من $ Q
$ q. عندما (القيمة): تمرير القيمة المتغيرة ، الوعد.
$ Q.ALL (الوعود): يجب تنفيذ وعود متعددة بنجاح قبل تنفيذها بنجاح. يتم تمرير القيمة كصفيف أو قيمة التجزئة. كل قيمة في الصفيف هي كائن الوعد المقابل للفهرس.