في العام الماضي ، كانت هناك حاجة إلى العديد من المشاريع لاستخدام JavaScript للقفل ، لذلك كتبت بعض المشاريع المماثلة ، واحدة منها:
نسخ رمز رمز على النحو التالي:
// نشرته Indream Luo
// contal: [email protected]
// الإصدار: الصينية 1.0.0
!
window.indream = window.indream || {} ؛
$ .indream = indream ؛
indream.async = {
//
//قفل
// القفل: عدد القفل
// الإجراء: الطريق للتنفيذ بعد فتح
//
قفل: وظيفة (قفل ، عمل) {
دولار.
$ .indream.async.waitings [lock] .push (Action) ؛
// إذا لم يتم استخدام القفل ، فإن الإجراء الحالي يحظر القفل
if (! $. indream.async.lockstatus [lock] && action) {
$ .indream.async.lockstatus [lock] = true ؛
if (ediuments.length> 2) {{
var args = 'Minfuments [2]' ؛
لـ (var i = 3 ؛ i <enduments.length ؛ i ++) {
args + = '، وسيطات [' + i + ']' ؛
}
eval ('$. indream.async.action.call (الإجراء ،' + args + ')') ؛
} آخر {
$ .indream.async.action.call (Action) ؛
}
}
} ،
//
// فتح
// القفل: عدد القفل
//
RELEASELOCK: وظيفة (قفل) {
$ .indream.async.waitings [lock] .shift () ؛
// إذا كانت قائمة انتظار الانتظار كائنًا ، فسيتم تنفيذ قائمة انتظار الانتظار ، وإلا فتح
if ($ .indream.async.waitings [lock] .length) {
$ .indream.async.waitings [lock] [0] () ؛
} آخر {
$ .indream.async.lockstatus [lock] = false ؛
}
} ،
//
// حالة القفل
//
Lockstatus: [] ،
//
// في انتظار إكمال الحدث
// قفل: ترميز القفل ، سيتم دمج نفس الترميز في تسلسل ، مما يؤدي
//
انتظر: وظيفة (قفل ، إجراء) {
دولار.
$ .indream.async.waitings [code] .push (Action) ؛
} ،
//
// في انتظار التسلسل
//
الانتظار: [] ،
//
// ذاكرة التخزين المؤقت للبيانات
//
فعل: {
//
// الطرق المتعلقة بالمراقبة والاستعمال
//
أتصل مرة أخرى: {
//
//شاشة
//
الاستماع: وظيفة (ActionName ، رد الاتصال) {
var list = $ .indream.async.action.calllback.list ؛
قائمة [ActionName] = قائمة [ActionName] || [] ؛
قائمة [ActionName] .push (رد الاتصال) ؛
} ،
//
//
//
Call: Function (ActionName ، args) {
var list = $ .indream.async.action.calllback.list ؛
if (قائمة [ActionName] && list [ActionName] .Length) {
لـ (var i in list [actionName]) {
$ .indream.async.action.call (قائمة [ActivityName] [i] ، args) ؛
}
}
} ،
//
// قائمة رد الاتصال الحالية
//
قائمة: []
} ،
//
// ما إذا كانت الطريقة موجودة وما إذا كانت المعلمة موجودة لاختيار طريقة التنفيذ المناسبة
//
Call: Function (Action) {
إذا (العمل) {
if (ediuments.length> 1) {{
var args = 'encuments [1]' ؛
لـ (var i = 2 ؛ i <endress.length ؛ i ++) {
args + = '، وسيطات [' + i + ']' ؛
}
eval ('Action (' + args + ')') ؛
} آخر {
فعل ()؛
}
}
}
}
}
} (window.jquery) ؛
عدة عناصر من القفل المتبادل هي:
• قفل وفتح
• في انتظار قائمة الانتظار
• طريقة التنفيذ
استخدام الأقفال أعلاه:
نسخ رمز رمز على النحو التالي:
// تحديد اسم القفل
var lock = 'scrolltop ()' ؛
// استخدم القفل
$ .indream.async.lock (lock ، function () {{) {
var scrolltop = $ (window).
var timer ؛
varfulltime = 100 ؛
لـ (Timer = 0 ؛ Timer <= بدوام كامل ؛ مؤقت += 10) {
setTimeout ('$ (window). scrolltop (' + (scrolltop * (full full -timer) / full prothere) + ') ؛' ، timer) ؛
}
// حرر القفل
setTimeout ('$. indream.async.releaselock ("' + lock + '") ؛' ، بدوام كامل) ؛
}) ؛
فيما يتعلق بتحقيق هذا الوقت ، شرح بإيجاز.
-قفل الدوران أو مبلغ الإشارة
JavaScript ليس له وظيفة قفل ، لذلك يتم تنفيذ الأقفال على مستويات عالية.
وفقًا لمبدأ JavaScript Single -thread ، فإن موارد مؤشر ترابط JS محدودة للغاية ، وهي غير مناسبة لاستخدام أقفال الدوران ، لذلك اخترت استخدام الإشارة.
إن قفل Self -Spin يشبه هذا ، بالطبع ، أن يكون أكثر فائدة:
نسخ رمز رمز على النحو التالي:
بينما (صحيح) {
// افعل شيئًا ...
}
يجب أن يستفيد هذا من الخيط الكامل حتماً. بالطبع ، إذا لزم الأمر ، يمكنك اختيار مجموعة من setInterval و Clearinterval لتحقيق ذلك ، وسيكون التأثير جيدًا.
طريقة كمية الإشارة بسيطة هنا ، والمبدأ بسيط ، تمامًا مثل الرمز. ترتيب العمل تقريبًا:
• ادفع قطاع الرمز (إجراء رد الاتصال) إلى قائمة انتظار الانتظار
• تحديد ما إذا كان القفل الحالي محتجزًا.
• عند إصدار القفل ، يتم تمرير التعديل التالي في قائمة انتظار الانتظار ، ويتم تمرير القفل إليه وتنفيذه
-في الإصدار التلقائي أو الإصدار اليدوي
الطريقة الأكثر راحة ، بالطبع ، يتم إصدارها تلقائيًا عند تنفيذ البرنامج الحالي ، ولكن هذا ليس بالأمر السهل ، لأن المزيد من المواقف تحتاج إلى تخصيص إصدار المشهد.
ما يتم استخدامه في حد ذاته هو الطريقة غير المتزامنة ، لذلك عادة ما تظهر المحتويات غير المتزامنة الأخرى ، مثل Ajax و JQuery الرسوم المتحركة. في هذا الوقت ، لا يفي الإصدار التلقائي بالطلب ، لأنه في الواقع ، فإن "التنفيذ" الحقيقي هو أنه بعد رد الاتصال غير المتزامن داخله ، أي فقط يمكن للمطورين فهم أنفسهم ، لذلك يختارون إطلاقه هنا.
ومع ذلك ، لا تزال هناك عيوب ، أي الإصدار المتكرر.
يمكن ملاحظة أن جميع كائنات القفل عامة ، أو أن جميع كائنات JS عامة ، ما لم يتم عزل المتغير المحلي على مستوى الوصول. ومع ذلك ، فإن "القفل" نفسه هو مورد عام ، لذلك لا توجد طريقة للتعامل معها.
يجب أن يكون التحسين الذي يمكن القيام به هنا أقفالًا باسم القفل العام مثل SetInterval و ClearInterval ، ويمكن أن يمنع معرفات القفل الخاصة منع الإصدار المتكرر. ومع ذلك ، لا يوجد في الكود القديم أعلاه ، ويقدر أنه سيتم استخدامه قريبًا.