لا توجد طريقة نوم في JS. إذا كنت ترغب في الإسبات ، فيجب عليك تحديد طريقة بنفسك.
وظيفة Sleep (numberMillis) {var now = new Date () ؛ var exittime = now.getTime () + numberMillis ؛ بينما (صحيح) {الآن = تاريخ جديد () ؛ if (now.getTime ()> exittime) return ؛ }}فيما يلي الإضافات:
بالإضافة إلى السرد JS ، تلتزم JWACs (JavaScript بدعم متصل متقدم) أيضًا بتجنب كتابة وظائف رد الاتصال التي تسمى بشكل غير متزامن من خلال تمديد بناء جملة JavaScript. النوم الذي تم تنفيذه باستخدام JWACs ، الرمز كما يلي:
نسخة الكود كما يلي:
وظيفة النوم (MSEC) {
var k = function_continuation ؛
setTimeOut (function () {resume k <- mesc ؛} ، msec) ؛
تعليق
}
هذا بناء الجملة أكثر مخيفًا ، وهو اسم طريقة مؤشر ترابط لا ينصح به في Java. بصراحة أنا أميل نحو السرد JS.
مثل السرد JS ، يحتاج JWACs أيضًا إلى أن يتم تجميعه ، ويتم كتابة Premompiler بلغة LISP. إنه أيضًا إصدار ألفا في الوقت الحالي. لمزيد من التقديمات والمقارنات بين الاثنين ، يرجى الرجوع إلى المقالة الجديدة في SitePoint: القضاء
عند كتابة البرامج النصية JavaScript المعقدة ، هناك حاجة في بعض الأحيان إلى الأمل في أن يتمكن البرنامج النصي لفترة زمنية محددة ، على غرار التأثير الذي حققه الخيط في Java أو أمر Sleep في البرنامج النصي.
كما نعلم جميعًا ، لا توفر JavaScript وظائف التحكم في مؤشر الترابط مماثلة لـ Java. على الرغم من وجود طريقتان ، SetTimeOut و SetInterval ، والتي يمكن أن تؤدي بعض التحكم في التنفيذ المحدد ، إلا أنهما لا يمكنهم تلبية جميع المتطلبات. كان هناك دائمًا الكثير من الأشخاص الذين يسألون عن كيفية تطبيق النوم/الإيقاف/الانتظار في JavaScript ، وهناك بالفعل بعض الحلول العرجاء:
أسهل وأسوأ طريقة هي كتابة حلقة ، قد يكون الرمز كما يلي:
نسخة الكود كما يلي:
وظيفة النوم (numbermillis) {
var الآن = تاريخ جديد () ؛
var exittime = now.getTime () + numberMillis ؛
بينما (صحيح) {
الآن = تاريخ جديد () ؛
if (now.getTime ()> exittime)
يعود؛
}
}
لا ينام الكود أعلاه في الواقع على مترجم البرنامج النصي ، كما أنه له تأثير زيادة بسرعة وحدة المعالجة المركزية إلى الحمل العالي. سيكون المتصفح في حالة وفاة مزيفة لتلك الفترة الزمنية.
ثانياً ، يستخدم الأشخاص الأذكياء تطبيق مربع الحوار الخاص لـ IE للتواصل مع بعضهم البعض. قد يكون الرمز كما يلي:
نسخة الكود كما يلي:
وظيفة النوم (مهلة) {
window.showmodaldialog ("javaScript: document.writeln ('<script> window.settimeout (function () {window.close () ؛} ،" + timeout + ") ؛ <// script>') ؛") ؛
} window.alert ("قبل النوم ...") ؛
النوم (2000) ؛
Window.Alert ("بعد النوم ...") ؛
وغني عن القول ، فقط الدعم IE (لا يمكن أن يحقق IE7 هدفه بسبب قيود الأمن).
بالإضافة إلى ذلك ، هناك أيضًا حيل مثل استخدام applet أو استدعاء WSPRINT'S WONDONDS SCRPT HOSTER.Sleep () ، والتي هي جميع الملاذات الأخيرة.
أخيرًا ، هناك أشخاص أكثر ذكاءً قد طوروا أفضل حل. دعونا نلقي نظرة على الكود أولاً:
نسخة الكود كما يلي:
وظيفة النوم (ميليس) {
var اطفال = njsruntime.createNotifier () ؛
setTimeout (storifier ، millis) ؛
intifier.wait-> () ؛
}
هذا صحيح ، فإن رؤية بناء جملة -> () مذهل على أنه رؤية وظيفة النموذج الأولي $ (). ومع ذلك ، سيقوم هذا البرنامج النصي بالإبلاغ عن أخطاء بناء الجملة مباشرة في المتصفح. في الواقع ، يجب أن يتم تجميعهم في JavaScript المعتمدة من قبل متصفح العميل. البرنامج النصي المترجم على النحو التالي:
نسخة الكود كما يلي:
وظيفة النوم (ميليس) {
var njf1 = njen (هذا ، الحجج ، "millis") ؛
NJ: بينما (1) {
حاول {switch (njf1.cp) {
الحالة 0: njf1._notifier = njsruntime.createNotifier () ؛
setTimeout (njf1._notifier ، njf1._millis) ؛
njf1.cp = 1 ؛
njf1._notifier.wait (njf1) ؛
يعود؛
الحالة 1: كسر NJ ؛
}} catch (ex) {
if (! njf1.except (ex ، 1))
يعود؛
}}
njf1.pf () ؛
}
لا أستطيع أن أفهم ذلك ، ولا أريد أن أفهم ذلك بعد الآن. سيتم تنفيذ كل هذه المهام بواسطة JavaScript السرد - تمديد JS الذي يوفر وظائف حظر غير متزامنة بالنسبة لنا. نحتاج فقط إلى كتابة بناء جملة Weird -> () من قبل ، ثم تنفيذ تأثير النوم من خلال التجميع المسبق أو التجميع الديناميكي للمقدمة.
يدعي جافا سكريبت السرد تحريرك من وظائف رد الاتصال بالدوار وكتابة مهام طويلة المدى. حاليًا ، لا يزال إصدار Alpha ، وهناك مثال على زر نقل في صفحة المثال. تنزيل رمز المصدر متاح أيضًا على الصفحة الرئيسية. مع معرفتي الأساسية الضعيفة ، لا يمكنني إلا أن أرى أن تنفيذ آلة الحالة يتم محاكاة في الكود. آمل أن يتمكن الأصدقاء الذين يتقنون الخوارزميات من أجلنا.
أخيرًا ، كان لديّ وجهة نظري دائمًا: يرجى الحفاظ على JavaScript بسيطًا ما لم يكن ذلك ضروريًا. قبل أن يتمكن JavaScript من توفير دعم الخيوط الأصلية ، ربما يمكننا تغيير التصميم لتجنب تطبيقات الحظر غير المتزامنة.
تطبيق شاق للحشرات
<نوع البرنامج النصي "Text/JavaScript">/*تنفيذ وظيفة الإيقاف المؤقت في JavaScript JavaScript نفسها لا تحتوي على وظيفة الإيقاف المؤقت (لا يمكن استخدام النوم) في نفس الوقت ، لا يمكن لـ VBScript استخدام DoEvents ، لذا اكتب هذه الوظيفة لتنفيذ هذه الوظيفة. JavaScript هي لغة كائن ضعيفة ، ويمكن أيضًا استخدام وظيفة ككائن. على سبيل المثال: [رمز] Test () {Alert ("Hellow") ؛ this.nextStep = function () {Alert ("nextStep") ؛ }} يمكننا استدعاء var mytest = new test () ؛ mytest.nextStep () ؛ عندما نتوقف مؤقتًا ، يمكن تقسيم الوظيفة إلى جزأين ، لم يتغير قبل عملية الإيقاف المؤقت ، ووضع الكود المراد تنفيذه بعد التوقف في This.nextStep. من أجل التحكم في الإيقاف المؤقت والاستمرار ، نحتاج إلى كتابة وظيفتين لتنفيذ وظائف الإيقاف المؤقت والاستمرار على التوالي. وظيفة الإيقاف المؤقت هي كما يلي: */وظيفة الإيقاف (OBJ ، iminsecond) {if (window.eventList == null) window.eventList = new Array () ؛ var ind = -1 ؛ لـ (var i = 0 ؛ i <window.eventList.length ؛ i ++) {if (window.eventList [i] = null) {window.eventList [i] = obj ؛ ind = i ؛ استراحة؛ }} if (ind ==-1) {ind = window.eventList.length ؛ window.eventList [ind] = obj ؛ } setTimeout ("goon (" + ind + ")" ، 1000) ؛}/*تضع هذه الوظيفة المراد إيقافها في نافذة الصفيف. الوظيفة المستمرة هي كما يلي: */function goon (ind) {var obj = window.eventList [ind] ؛ window.eventList [ind] = null ؛ إذا (obj.nextStep) obj.nextStep () ؛ آخر OBJ () ؛}/*هذه الوظيفة تستدعي طريقة NextStep للوظيفة المعلقة. إذا لم تكن هذه الطريقة متوفرة ، فسيتم استدعاء الوظيفة مرة أخرى. بعد كتابة الوظيفة ، يمكننا كتابة المجلد التالي: */وظيفة test () {Alert ("Hellow") ؛ وقفة (هذا ، 1000) ؛ // استدعاء وظيفة الإيقاف المؤقت this.nextStep = function () {Alert ("nextStep") ؛ }} </script>