أصبح تفاعل صفحات الويب أكثر تعقيدًا ، وأصبحت JavaScript أيضًا عمليات غير متزامنة أكثر فأكثر. على سبيل المثال ، يتطلب طلب AJAX المشترك استجابة للعمليات عند اكتمال الطلب. عادة ما يكون الطلب غير متزامن. أثناء عملية الطلب ، يمكن للمستخدم تنفيذ عمليات أخرى دون منع الصفحة. تأثير التفاعل غير المتزامن هذا ودود للغاية للمستخدم. لكن بالنسبة للمطورين ، من غير الودي للغاية التعامل مع هذا النوع من العمليات بكميات كبيرة. يجب تحديد العمليات التي تكملها الطلبات غير المتزامنة مسبقًا في وظيفة رد الاتصال ، ويجب استدعاء هذه الوظيفة بعد اكتمال الطلب. ستجعل طريقة البرمجة غير المتزامنة غير الخطية هذه غير مرتاح للمطورين ، كما أنها تجلب العديد من الإزعاج ، مما يزيد من اقتران الكود وتعقيده ، وستكون تنظيم الكود غير ضروري للغاية ، مما يقلل بشكل كبير من قابلية الصيغة في الرمز. الوضع أكثر تعقيدًا. إذا كان على العملية الانتظار حتى يتم الانتهاء من طلبات Ajax غير متزامنة متعددة قبل تنفيذها ، فسيتم دخول وظيفة رد الاتصال. إذا احتاجت عدة طبقات إلى التداخل ، فيمكنك فقط طلب النعم.
دعنا نلقي نظرة على الوظائف غير المتزامنة الشائعة التالية.
نسخة الكود كما يلي:
var showmsg = function () {
setTimeout (function () {
تنبيه ('hello') ؛
} ، 5000) ؛
} ؛
عادة ما يتم ذلك إذا كنت ترغب في إضافة رد اتصال إلى الوظيفة.
نسخة الكود كما يلي:
var showmsg = function (callback) {
setTimeout (function () {
تنبيه ('hello') ؛
// أضف رد الاتصال هنا
أتصل مرة أخرى()؛
} ، 5000) ؛
} ؛
إذا كنت تستخدم وعدًا Easy.js ، فستكون طريقة إضافة عمليات الاسترجاعات أكثر أناقة ، طالما أنك بحاجة إلى تغليف الوظيفة الأصلية في مثيل الوعد.
نسخة الكود كما يلي:
var showmsg = function () {
// بناء مثيل الوعد
var promise = new E.Promise () ؛
setTimeout (function () {
تنبيه ('hello') ؛
// تغيير حالة الوعد
Promise.Resolve ('Done') ؛
} ، 5000) ؛
// العودة إلى مثال الوعد
عودة الوعد
} ؛
هناك 3 خطوات رئيسية لتغليف وظيفة عادية في مثيل الوعد. الخطوة الأولى هي بناء مثيل وعد داخل الوظيفة. والخطوة الثانية هي تغيير حالة الوعد لإكمالها بعد تنفيذ وظيفة النشر. الخطوة الثالثة هي إعادة مثيل الوعد هذه. كل مثال وعد له 3 حالات ، أي معلقة (غير مكتملة) ، وحل (مكتمل ، ناجح) ، ورفض (رفض ، فشل). دعنا نلقي نظرة على كيفية إضافة عمليات الاسترجاعات.
نسخة الكود كما يلي:
Showmsg (). ثم (وظيفة (str) {
// يضاف رد الاتصال هنا
رد الاتصال (STR) ؛
}) ؛
هذا يفصل تمامًا وظيفة رد الاتصال عن الوظيفة غير المتزامنة الأصلية ، ومن منظور تنظيم التعليمات البرمجية ، فهي أكثر أناقة. يقبل حل المعلمة التي يمكنها بسهولة نقل البيانات إلى رد الاتصال المضافة باستخدام الطريقة ثم.
بالنسبة لطلبات Ajax ، يقوم easy.js بتغليف طريقة Ajax مباشرة في كائن وعد ، ويمكنك إضافة طريقة THE THE TAND مرة أخرى مباشرة.
نسخة الكود كما يلي:
E.Ajax ({
عنوان URL: 'Test1.php' ،
النوع: "الحصول"
})
.Then (function () {
// أضف رد اتصال مع طلب ناجح
}، وظيفة(){
// أضف رد اتصال فشل
}) ؛
تقبل الطريقة ثم 2 وظائف كمعلمات. الوظيفة الأولى هي رد اتصال مكتمل ، والثاني هو رد اتصال فاشل.
ماذا لو كان هناك العديد من طلبات AJAX المذكورة أعلاه؟ ثم عليك استخدام طريقة متى. يمكن أن تقبل هذه الطريقة مثيلات الوعد المتعددة كمعلمات.
نسخة الكود كما يلي:
طلبات VAR = E. when (E.Ajax ({
عنوان URL: 'Test1.php' ،
النوع: "الحصول"
}) ، e.ajax ({
عنوان URL: 'Test2.php' ،
النوع: "الحصول"
})) ؛
طلبات
console.log ('النجاح:' + arg1 [0] + arg2 [0]) ؛
} ، وظيفة (arg1 ، arg2) {
console.log ('فشل:' + arg1 + arg2) ؛
}) ؛
تتمثل الطريقة في تخزين حالات الوعد المتعددة في صفيف ، والانتظار حتى يتم الانتهاء من جميع مثيلات الصفيف قبل تنفيذ رد الاتصال المكتمل. بمجرد رفض المثيل ، يتم تنفيذ رد الاتصال المرفوض على الفور.
نمط الوعد هو واحد من مواصفات CommonJs. العديد من مكتبات JavaScript السائدة لديها تطبيقات مقابلة ، مثل jQuery و Dojo ، والتي تأجلت لتنفيذ هذه الوظائف. هنا ما زلت أريد أن أشكو من تأجيل jquery. إذا وضعنا جانباً استخدامه الداخلي ، يجب أن يكون هذا هو الوحدة التي تحتوي على أدنى معدل استخدام للمستخدم ، والتي لها علاقة معينة مع طريقة الاستخدام الأكثر تعقيدًا.