ไม่มีวิธีการนอนหลับใน JS หากคุณต้องการจำศีลคุณต้องกำหนดวิธีการด้วยตัวเอง
ฟังก์ชั่นนอนหลับ (numbermillis) {var now = new date (); var exittime = now.getTime () + numbermillis; ในขณะที่ (จริง) {now = date ใหม่ (); if (now.getTime ()> exittime) กลับ; -ต่อไปนี้เป็นส่วนเพิ่มเติม:
นอกเหนือจากการเล่าเรื่อง JS แล้ว JWACs (JavaScript ที่มีการสนับสนุนความต่อเนื่องขั้นสูง) ยังมุ่งมั่นที่จะหลีกเลี่ยงการเขียนฟังก์ชั่นการโทรกลับที่เรียกว่า Asynchronously ที่มีปัญหาโดยการขยายไวยากรณ์ JavaScript การนอนหลับใช้กับ JWACs รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน Sleep (MSEC) {
var k = function_continuation;
settimeout (function () {resume k <- mesc;}, msec);
ระงับ;
-
ไวยากรณ์นี้น่ากลัวยิ่งกว่าและเป็นชื่อวิธีเธรดที่ไม่แนะนำใน Java ตรงไปตรงมาฉันมักจะเล่าเรื่อง JS
เช่นเดียวกับการเล่าเรื่อง JSS JWAC ยังต้องมีการคอมไพล์ล่วงหน้าและ precompiler เขียนด้วยภาษา LISP นอกจากนี้ยังเป็นรุ่นอัลฟ่าในขณะนี้ สำหรับการแนะนำเพิ่มเติมและการเปรียบเทียบของทั้งสองโปรดดูบทความใหม่เกี่ยวกับ SitePoint: กำจัด Async JavaScript Callbacks โดยการประมวลผลล่วงหน้า
เมื่อเขียนสคริปต์ JavaScript ที่ซับซ้อนบางครั้งมีความจำเป็นที่จะต้องหวังว่าสคริปต์จะสามารถหยุดยั้งได้ตามระยะเวลาที่กำหนดคล้ายกับเอฟเฟกต์ที่เกิดขึ้นจากเธรดการต่อสู้ใน Java หรือคำสั่ง SLEES ในสคริปต์ SH
อย่างที่เราทราบกันดี JavaScript ไม่ได้ให้ฟังก์ชั่นการควบคุมเธรดคล้ายกับ Java แม้ว่าจะมีสองวิธีคือ Settimeout และ SetInterval ซึ่งสามารถควบคุมการดำเนินการตามกำหนดเวลาได้ แต่ก็ไม่สามารถปฏิบัติตามข้อกำหนดทั้งหมดได้ มีหลายคนมักจะถามว่าจะใช้การนอนหลับ/หยุดชั่วคราว/รอในจาวาสคริปต์และมีวิธีแก้ปัญหาที่อ่อนแอมาก:
วิธีที่ง่ายที่สุดและแย่ที่สุดคือการเขียนลูปรหัสอาจมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นนอนหลับ (numbermillis) {
var now = new Date ();
var exittime = now.getTime () + numbermillis;
ในขณะที่ (จริง) {
ตอนนี้ = วันที่ใหม่ ();
if (now.getTime ()> exittime)
กลับ;
-
-
รหัสข้างต้นจริง ๆ แล้วไม่ได้นอนหลับล่ามสคริปต์และมันยังมีผลในการเพิ่ม CPU อย่างรวดเร็วเป็นโหลดสูง เบราว์เซอร์จะอยู่ในสภาพตายปลอมในช่วงเวลานั้น
ประการที่สองคนฉลาดใช้การใช้กล่องโต้ตอบพิเศษของ IE เพื่อเชื่อมต่อซึ่งกันและกัน รหัสอาจมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นนอนหลับ (หมดเวลา) {
window.showmodaldialog ("JavaScript: document.writeLn ('<script> window.settimeout (ฟังก์ชั่น () {window.close ();}," + หมดเวลา + "); <// สคริปต์>');");
} window.alert ("ก่อนนอน ... ");
การนอนหลับ (2000);
window.alert ("หลังการนอนหลับ ... ");
ไม่จำเป็นต้องพูดเพียงแค่สนับสนุน (IE7 ไม่สามารถบรรลุเป้าหมายได้เนื่องจากข้อ จำกัด ด้านความปลอดภัย)
นอกจากนี้ยังมีกลอุบายเช่นการใช้แอปเพล็ตหรือการเรียกใช้ wscript.sleep () ของสคริปต์สคริปต์ของ Windows สคริปต์ซึ่งเป็นทางเลือกสุดท้ายทั้งหมด
ในที่สุดก็มีคนที่ฉลาดกว่าที่ได้พัฒนาอาจเป็นทางออกที่ดีที่สุด มาดูรหัสก่อน:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นการนอนหลับ (มิลลิส) {
var notifier = njsruntime.createnotifier ();
settimeout (ผู้แจ้งเตือน, มิลลิส);
notifier.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 ที่ให้ฟังก์ชันการปิดกั้นแบบอะซิงโครนัสสำหรับเรา เราเพียงแค่ต้องเขียนไวยากรณ์แปลก ๆ -> () ก่อนจากนั้นใช้เอฟเฟกต์การนอนหลับผ่านการรวบรวมล่วงหน้าหรือการรวบรวมแบบไดนามิกของเบื้องหน้า
JavaScript เรื่องเล่าเรียกร้องให้คุณปลดปล่อยคุณจากฟังก์ชั่นการโทรกลับเวียนหัวและเขียนงานที่ใช้งานได้ยาวนาน ปัจจุบันยังคงเป็นเวอร์ชันของอัลฟ่าและมีตัวอย่างของปุ่มเคลื่อนที่ในหน้าตัวอย่าง การดาวน์โหลดซอร์สโค้ดยังมีอยู่ในหน้าแรก ด้วยความรู้พื้นฐานที่อ่อนแอของฉันฉันแทบจะไม่เห็นว่าการใช้งานเครื่องจักรของรัฐนั้นถูกจำลองในรหัส ฉันหวังว่าเพื่อนที่มีความเชี่ยวชาญในอัลกอริทึมสามารถแยกวิเคราะห์ได้สำหรับเรา
ในที่สุดฉันก็มีมุมมองของฉันเสมอ: โปรดให้ JavaScript ง่ายขึ้นเว้นแต่ว่าจำเป็น ก่อนที่ JavaScript สามารถให้การสนับสนุนการทำเกลียวแบบดั้งเดิมบางทีเราสามารถเปลี่ยนการออกแบบเพื่อหลีกเลี่ยงแอปพลิเคชันการปิดกั้นแบบอะซิงโครนัส
การดำเนินการคดเคี้ยวของข้อบกพร่อง
<ประเภทสคริปต์ "text/javascript">/*การใช้งานฟังก์ชั่นหยุดชั่วคราวใน JavaScript JavaScript นั้นไม่มีฟังก์ชั่นหยุดชั่วคราว (ไม่สามารถใช้งานได้) ในเวลาเดียวกัน VBScript ไม่สามารถใช้ doevents ได้ดังนั้นเขียนฟังก์ชั่นนี้เพื่อใช้ฟังก์ชันนี้ JavaScript เป็นภาษาวัตถุที่อ่อนแอและสามารถใช้ฟังก์ชั่นเป็นวัตถุได้ ตัวอย่างเช่น: [รหัส] การทดสอบฟังก์ชั่น () {แจ้งเตือน ("hellow"); this.nextstep = function () {alert ("nextstep"); }} เราสามารถเรียก var mytest = new test (); mytest.nextstep (); เมื่อเราหยุดชั่วคราวฟังก์ชั่นสามารถแบ่งออกเป็นสองส่วนไม่เปลี่ยนแปลงก่อนการหยุดชั่วคราวและวางรหัสที่จะดำเนินการหลังจากหยุดชั่วคราวใน this.nextstep เพื่อควบคุมการหยุดชั่วคราวและความต่อเนื่องเราจำเป็นต้องเขียนสองฟังก์ชั่นเพื่อใช้ฟังก์ชั่นหยุดชั่วคราวและฟังก์ชั่นต่อเนื่องตามลำดับ ฟังก์ชั่นหยุดชั่วคราวมีดังนี้: */ฟังก์ชั่นหยุดชั่วคราว (obj, iminsecond) {ถ้า (window.eventList == null) window.eventList = new Array (); var ind = -1; สำหรับ (var i = 0; i <window.eventlist.length; i ++) {ถ้า (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);}/*ฟังก์ชั่นนี้ทำให้ฟังก์ชันถูกหยุดลงในหน้าต่างอาร์เรย์ eventList และในเวลาเดียวกันเรียกฟังก์ชั่นต่อเนื่องผ่าน settimeout ฟังก์ชั่นต่อเนื่องมีดังนี้: */ฟังก์ชั่น goon (ind) {var obj = window.eventlist [ind]; window.eventList [ind] = null; if (obj.nextstep) obj.nextstep (); else obj ();}/*ฟังก์ชั่นนี้เรียกวิธีการ NextStep ของฟังก์ชันที่ถูกระงับ หากวิธีนี้ไม่พร้อมใช้งานฟังก์ชั่นจะถูกเรียกอีกครั้ง หลังจากเขียนฟังก์ชั่นเราสามารถเขียนเล่มต่อไปนี้: */ฟังก์ชันทดสอบ () {Alert ("Hellow"); หยุดชั่วคราว (นี่, 1000); // เรียกฟังก์ชันหยุดชั่วคราว this.nextstep = function () {alert ("nextstep"); }} </script>