تمرير الوظيفة كمعلمة في وظيفة أخرى. هذه الوظيفة تسمى وظيفة رد الاتصال
غالبًا ما يتم مواجهته في هذا الموقف ، يتم الانتهاء من طبقات A و B للمشروع من قبل موظفين مختلفين بالتعاون. الطبقة A هي المسؤولة عن Funa Funa ، والطبقة B مسؤولة عن FUNCB. عندما ترغب B Layer في استخدام بيانات وحدة معينة ، أخبر طاقم الطبقة A أن أحتاج إليك لتقديم بيانات تلبي احتياجات معينة ، وتزودني بواجهة.
قال الموظفون في المستوى أ: سأزودك بالبيانات ، وكيفية عرض ومعالجة أعمال B.
بالطبع ، لا يمكن للطبقة B توفير واجهة بيانات لكل متطلبات. يوفر B واجهة لتمريرها. يحصل B على البيانات ، ثم يكتب B الوظيفة لعرضها.
أي أنك تحتاج إلى العمل مع الآخرين والآخرين يقدمون بيانات ، ولا تحتاج إلى التركيز على كيفية الحصول على البيانات أو بناءها. تحتاج فقط إلى العمل على البيانات التي تحصل عليها. تحتاج إلى استخدام وظيفة رد الاتصال في هذا الوقت
لذلك ، فإن عمليات الاسترجاعات هي في الأساس نمط تصميم ، وتتبع مبادئ تصميم jQuery (بما في ذلك الأطر الأخرى) هذا النمط.
مثال على استخدام عمليات الاسترجاعات في المزامنة (الحظر) هو تنفيذ FUNC2 بعد تنفيذ رمز FUNC1.
نسخة الكود كما يلي:
var func1 = function (callback) {
// افعل شيئًا.
(Callback && typeof (callback) === "function") && callback () ؛
}
FUNC1 (FUNC2) ؛
var func2 = function () {
}
مثال على عمليات الاسترداد غير المتزامنة:
نسخة الكود كما يلي:
$ (document). ready (callback) ؛
$ .ajax ({
URL: "Test.html" ،
السياق: document.body
}). تم (function () {
$ (this) .addClass ("Done") ؛
}). FAIL (function () {
تنبيه ("خطأ") ؛
}). دائما (وظيفة () {
تنبيه ("كاملة") ؛
}) ؛
لاحظ أن طلب AJAX غير متزامن بالفعل ، ولكن يطلب هذا الطلب من قبل المتصفح. عندما يتم تغيير حالة الطلب ، إذا تم تحديد رد اتصال من قبل ، فإن الخيط غير المتزامن سيولد حدث تغيير الحالة ويضعه في قائمة انتظار محرك JavaScript للانتظار للمعالجة. انظر: http://www.phpv.net/html/1700.html
متى سيتم تنفيذ رد الاتصال
عادة ما يتم تنفيذ وظائف رد الاتصال أخيرًا في موقف متزامن ، ولكن قد لا يتم تنفيذها في موقف غير متزامن لأن الحدث لم يتم تشغيله أو لم يتم الوفاء بالظروف.
استخدام حالات رد الاتصال
تحميل الموارد: قم بتنفيذ رد الاتصال بعد التحميل الديناميكي لملفات JS ، وقم بتنفيذ رد الاتصال بعد تحميل iframe ، وتنفيذ رد الاتصال بعد تحميل رد الاتصال Ajax ، وتنفيذ رد الاتصال بعد تحميل الصورة ، Ajax ، إلخ.
تعتمد أحداث DOM وأحداث Node.js على آلية رد الاتصال (قد تواجه عمليات الاسترجاعات Node.JS مشاكل في التعشيش متعددة الطبقات).
وقت تأخير setTimeout هو 0. غالبًا ما يستخدم هذا الاختراق. الوظيفة التي يطلق عليها SetTimeOut هي في الواقع تجسيد رد الاتصال
استدعاء السلسلة: عند استدعاء السلسلة ، يكون من السهل تنفيذ استدعاء السلسلة في طريقة المقيِّم (Setter) (أو في الأساليب التي لا تُرجع قيمًا) ، ولكن من الصعب نسبيًا تنفيذ Getter القيمة ، لأنك تحتاج إلى إرجاع القيمة التي تحتاجها بدلاً من هذا المؤشر. إذا كنت ترغب في تطبيق طريقة السلسلة ، فيمكنك استخدام وظيفة رد الاتصال لتنفيذها.
تدعو وظيفة SetTimeOut و SetInterval الحصول على قيمة الإرجاع الخاصة بهم. نظرًا لأن كلتا الوظيفتين غير متزامنين ، أي توقيت الاتصالات والعملية الرئيسية للبرنامج مستقلان نسبيًا ، لا توجد وسيلة لانتظار قيمة إرجاعهما في الجسم ، ولن يتوقف البرنامج وينتظر عند فتحهما ، وإلا فإن معنى setTimeOut و setInterval سوف يضيع. لذلك ، لا معنى لها استخدام العودة ، لذلك لا يمكن استخدام رد الاتصال إلا. معنى رد الاتصال هو إخطار وظيفة الوكيل لنتائج تنفيذ المؤقت للمعالجة في الوقت المناسب.
يجب أن يكون لدي بعض المعلومات التي تم جمعها عبر الإنترنت ويجب أن أفهمها. سأقوم بفرز مثال بنفسي:
نسخة الكود كما يلي:
وظيفة متعة (num ، رد الاتصال) {
if (num <0) {
تنبيه ("استدعاء وظيفة المستوى A للتعامل معها!") ؛
التنبيه ("لا يمكن أن تكون البيانات سلبية ، خطأ في الإدخال!") ؛
} آخر إذا (num == 0) {
تنبيه ("استدعاء وظيفة المستوى A للتعامل معها!") ؛
تنبيه ("عنصر البيانات هذا غير موجود!") ؛
}آخر{
تنبيه ("استدعاء وظيفة مستوى B للمعالجة!") ؛
رد الاتصال (1) ؛
}
}
اختبار الوظيفة () {
var num = document.getElementById ("Score"). value ؛
متعة (num ، وظيفة (عودة) {// وظيفة معالجة الطبقة B المجهولة
تنبيه (":"+back) ؛
إذا (num <2)
تنبيه ("الرقم هو 1") ؛
آخر إذا (num <= 3)
تنبيه ("الرقم هو 2 أو 3!") ؛
آخر
تنبيه ("رقم أكبر من 3!") ؛
})
}
عندما تبدأ الوظيفة في تنفيذ المرح ، انتقل أولاً لتحديد ما إذا كان NUM هو رقم سالب أو صفر ، وإلا قم بتنفيذ وظيفة معالجة الطبقة B (":"+Back) ؛ الإخراج 1 ، وحدده على أنه <2 ، <= 3 ،> 3 ، إلخ.
نصائح تجربة:
من الأفضل التأكد من وجود رد الاتصال ويجب أن يكون مرجعًا للوظيفة أو تعبير الوظيفة:
نسخة الكود كما يلي:
(Callback && typeof (callback) === "function") && callback () ؛
نسخة الكود كما يلي:
var obj = {
init: وظيفة (رد الاتصال) {
// تودو ...
if (callback && typeof (callback) === "function") && callback ()) {
رد الاتصال ('init ...') ؛ // رد الاتصال
}
}
أخيرًا ، حول سبب حاجتك إلى استخدام وظيفة رد الاتصال؟ الاستعارة التالية حية للغاية ومثيرة للاهتمام.
إذا كان لديك شيء يمكنك فعله ، فانتقل إلى المهجع التالي للعثور على زميل في الفصل وتجد أن الشخص ليس هناك ، ماذا يجب أن تفعل؟
الطريقة 1: انتقل إلى المهجع التالي كل بضع دقائق لمعرفة ما إذا كان الشخص موجودًا
الطريقة 2: يرجى الاتصال بشخص ما في نفس المنهب معه واتصل بك عندما تراه يعود
السابق هو الاقتراع ، والأخير هو رد الاتصال.
ثم تقول ، هل يمكنني الانتظار مباشرة في المهجع المجاور حتى يعود زملائي في الفصل؟
نعم ، ولكن بهذه الطريقة ، كان بإمكانك توفير الوقت للقيام بأشياء أخرى ، ولكن عليك الآن أن تضيعها عند الانتظار. تحويل المكالمة الأصلية غير المتزامنة غير المتزامنة إلى مكالمة متزامنة.
يتم استخدام عمليات الاسترداد JavaScript في سيناريوهات المكالمات غير المتزامنة ، وأداء استخدام عمليات الاسترجاعات أفضل من الاقتراع.