حل أن وظيفة رد الاتصال عميق للغاية ، ويجب تنفيذ المنطق المتوازي بشكل متسلسل. يمثل الوعد النتيجة النهائية لعملية غير متزامنة. الطريقة الرئيسية للتفاعل مع الوعد هي تسجيل وظيفة رد الاتصال من خلال طريقة () لتلقي قيمة النتيجة النهائية للوعد.
وتشمل البروتوكولات المتعلقة بالوعد promisea و promisea+
تحديد وعد الطبقة
حدد قائمة انتظار قائمة انتظار السمة ، وقم بتهيئة الصفيف الفارغ []
تحديد قيمة قيمة الخاصية ، وتهيئة فارغة
حدد حالة الحالة للخاصية وتهيئة "المعلقة" (القيمة الافتراضية)
تحديد طريقة الأعضاء getQueue () ، قائمة انتظار سمة العودة
تحديد طريقة الأعضاء getStatus () ، إرجاع حالة السمة
تحديد طريقة الأعضاء setStatus () ، وضع الحالة ، معلمات المرور: الحالة ، القيمة
حدد أن الحالة قد تم الوفاء بها أو رفضها ،
تعيين خاصية الحالة this.status = الحالة
اضبط خاصية القيمة this.value = value || فارغة ، إذا لم تمر بالقيمة ، فهي فارغة
تحديد تجميد متغير التجميد
حدد طريقة الأعضاء ISFOULFILDED () لتحديد ما إذا كانت الحالة الحالية (مكتملة)
تحديد طريقة الأعضاء ISREJED () لتحديد ما إذا كانت الحالة الحالية (فشل)
حدد طريقة الأعضاء ISPending () ، حدد Master Status Master هو (انتظار)
حدد طريقة الأعضاء ثم () ، معلمات المرور: رد اتصال ناجح على ذلك ، فاشلة رد الاتصال الفاشل
تحديد وظيفتين رد الاتصال: كائن معالج ، سمة تم الوفاء بها ، مرفوضة
حدد الخاصية المؤجلة لكائن المعالج ، الكائن المؤجل
تحديد ما إذا كانت الحالة الحالية تنتظر. إذا كانت تنتظر ، فضع كائن المعالج في صفيف قائمة الانتظار
إذا لم تكن حالة انتظار ، فاتصل بالطريقة الإجراء () لكائن Utils ، المعلمة: الحالة ،
إرجاع معالج. deferred.promise كائن
تحديد فئة مؤجلة
تحديد الوعد السمة وتهيئة كائن الوعد
حدد طريقة العضو حل () ، تمرير المعلمة: نتيجة النتيجة
حدد حالة كائن الوعد على أنه الانتظار والعودة مباشرة
استدعاء طريقة getQueue () لكائن الوعد للحصول على صفيف قائمة الانتظار
صفيف حلقة
// TODO يدعو استخدام فئة الأدوات. الإجراء () الطريقة ، المعلمات: "الوفاء" ، العنصر ، معلومات خطأ
استدعاء طريقة setStatus () لكائن الوعد ، وضبط الحالة ، والمعلمات: "الوفاء" ، والنتيجة
تحديد طريقة العضو رفض ، مرور المعلمة: رسالة خطأ خطأ
حدد حالة كائن الوعد على أنه الانتظار والعودة مباشرة
استدعاء طريقة getQueue () لكائن الوعد للحصول على صفيف قائمة الانتظار
صفيف حلقة
// TODO ، استدعاء فئة الأدوات. الإجراء () الطريقة ، المعلمات: "رفض" ، عنصر ، معلومات خطأ
استدعاء طريقة setStatus () لكائن الوعد ، وضبط الحالة ، والمعلمات: "الوفاء" ، والنتيجة
حدد استخدام فئة الأدوات ، وقم بتنفيذها على الفور باستخدام وظائف مجهولة ، واحصل على كائن
إرجاع الكائن ، هناك إجراء طريقة () في الكائن
حدد الإجراء () طريقة ، معلمات المرور: نوع الحالة ، صفيف معالج المعالج ، نتيجة النتيجة
احصل على وظيفة المعالجة func ، في معالج [النوع]
كنت بالدوار عندما وصلت إلى هنا. . .
كيفية استخدام:
تحديد وظيفة ajax ، مرر المعلمة: مسار URL
احصل على الكائن المؤجل وخرج جديدًا
رمز AJAX لطلب البيانات ، في طريقة رد الاتصال التي تُرجع البيانات
إذا تم استدعاء طريقة حل () الكائن المؤجل بنجاح ، المعلمة: إرجاع بيانات
إذا فشلت طريقة الرفض () للكائن المؤجل فشلت ، المعلمة: البيانات التي تم إرجاعها
إرجاع الكائن المؤجل.
استدعاء طريقة AJAX () للحصول على كائن الوعد ، المعلمة: URL ،
استدعاء طريقة Then () لكائن الوعد ، المعلمات: وظيفة مجهولة
استدعاء طريقة AJAX () للحصول على كائن الوعد وإعادة هذا الكائن
تشكيل مكالمة سلسلة
جزء JS:
<script> // Promise Code Part (اخترت حزام الكلب) Promise = function () {this.queue = [] ؛ this.value = null ؛ this.status = 'pending' ؛ // المعلقة المنفذة} ؛ promise.prototype.getqueue = function () {return this.queue ؛ {this.status = s ؛ this.value = value || باطل؛ this.queue = [] ؛ var freezeObject = object.freeze || وظيفة(){}؛ freezeObject (هذا) ؛ // حالة الوعد لا رجعة فيها} {رمي خطأ جديد ({message: "لا تدعم الحالة:" + s}) ؛ }} ؛ promise.prototype.isfulfilled = function () {return this.status === 'الوفاء' ؛} ؛ promise.prototype.isrejected = function () {return this.status === 'rejected' ؛ دالة (onfulfilled ، onRejected) {var handler = {'الوفاء': onfulfilled ، 'rejected': onRejected} ؛ Handler.Deferred = جديد مؤلف () ؛ if (! this.ispending ()) {// هذا مسموح بتغيير حالة الوعد أولاً ثم إضافة عمليات الاسترجاع. } آخر {this.queue.push (handler) ؛ // ثم يمكن استدعاء عدة مرات على نفس الوعد ؛ المواصفات 2.2.6} معالج الإرجاع. الإجراء = النوع ، النتيجة) {var func = type] ؛ NewResult.Then (دالة (البيانات) {// def.resolve (data) ؛ //} ، الدالة (err) {// def.reject (err) ؛ //}) ؛ // إذا تم الوفاء بـ X ، فإن الوفاء بنفس القيمة. الانتقال (DEF ، "erct) ؛ رمي خطأ جديد ({'message': "لا يدعم النوع:" + type}) ؛ } Queue = this.promise.getqueue () ؛ لـ (var i = 0 ، len = queue.length ؛ i <len ؛ i ++) {utils.procedure ("الوفاء" ، قائمة الانتظار [i] ، نتيجة) ؛ } this.promise.setStatus ('الوفاء' ، النتيجة) ؛} ؛ eDERD.Prototype.reject = function (err) {if (! this.promise.ispending ()) {return ؛ } Queue = this.promise.getqueue () ؛ لـ (var i = 0 ، len = queue.length ؛ i <len ؛ i ++) {utils.procedure ('rejected' ، Queue [i] ، err) ؛ هذا. var xhr = new xmlhttprequest () ؛ XHR.OnReadyStateChange = function () {if (xHr.ReadyState ==== 4) {if ((xHr.Status> = 200 && xhr.status <300) || error ({message: xhr.status})) ؛ }}}}} ؛ XHR.Open ('get' ، url ، true) ؛ XHR.SEND (NULL) ؛ return def.promise ؛} ajax ('test.php؟ Act = 1'). {console.error (err) ؛})PHP:
<؟ phpif ($ _ get ['act'] == 1) {echo json_encode (array ("code" => 200)) ؛} else elder ($ _ get ['act'] == 2) {echo json_encode (echo ("code" => 300)) ؛ json_encode (صفيف ("رمز" => 400)) ؛}الملخص أعلاه للتعلم البسيط واستخدام وعد JavaScript هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.