1. ปัญหาเกี่ยวกับการใช้ตัวจับเวลาในโหนดคือมันไม่ถูกต้อง ตัวอย่างเช่น settimeout () ตั้งค่างานที่จะดำเนินการหลังจาก 10ms แต่หลังจาก 9ms งานจะใช้เวลา 5ms เมื่อมันเป็นตัวจับเวลาอีกครั้งมันก็ล่าช้า 4ms
มีหลายสิ่งหลายอย่างที่จะพูดเกี่ยวกับตัวจับเวลาในโหนด
2. ดูรหัส:
การคัดลอกรหัสมีดังนี้:
process.nexttick (function () {
console.log ("การดำเนินการล่าช้า");
-
console.log ("ดำเนินการ 1 ปกติ");
console.log ("การดำเนินการทั่วไป 2");
console.log ("การดำเนินการปกติ 3");
console.log ("การดำเนินการทั่วไป 4");
จากตัวอย่างนี้ฉันคิดว่าทุกคนสามารถเห็นได้อย่างชัดเจนว่า Nexttick () ใช้สำหรับอะไร ส่วนใหญ่จะใช้สำหรับการดำเนินการแบบอะซิงโครนัส
ดูรหัส:
การคัดลอกรหัสมีดังนี้:
setimmediate (function () {
console.log ("การดำเนินการล่าช้า");
-
console.log ("การดำเนินการปกติ");
เราพบว่า setimmediate ยังดำเนินการแบบอะซิงโครนัส มันแปลก
แล้วความแตกต่างระหว่างมันกับ Nexttick () คืออะไร?
ดูรหัส:
รหัส 1:
การคัดลอกรหัสมีดังนี้:
process.nexttick (function () {
console.log ("Nexttick Delay")
-
setimmediate (function () {
console.log ("setimmediate delay");
-
console.log ("การดำเนินการปกติ");
ผลลัพธ์:
รหัส 2:
การคัดลอกรหัสมีดังนี้:
setimmediate (function () {
console.log ("setimmediate delay");
-
process.nexttick (function () {
console.log ("Nexttick Delay")
-
console.log ("การดำเนินการปกติ");
ผลลัพธ์:
ฉันพบว่าแม้ว่าลำดับรหัสจะแตกต่างกัน แต่ผลลัพธ์การดำเนินการก็เหมือนกัน
จากผลลัพธ์เราสามารถค้นหาได้:
ลำดับความสำคัญของฟังก์ชั่นการเรียกใช้การเรียกกลับของ NextTick () สูงกว่า SetImMediate ();
process.nexttick () เป็นของผู้สังเกตการณ์ที่ไม่ได้ใช้งานและ setimmediate () เป็นของการตรวจสอบผู้สังเกตการณ์ ในการตรวจสอบวนรอบแต่ละรอบผู้สังเกตการณ์ที่ไม่ได้ใช้งานอยู่ข้างหน้าผู้สังเกตการณ์ I/O และผู้สังเกตการณ์ I/O อยู่ข้างหน้าผู้สังเกตการณ์ตรวจสอบ
ในการใช้งานเฉพาะฟังก์ชันการโทรกลับของ process.nexttick () จะถูกเก็บไว้ในอาร์เรย์
ผลลัพธ์ของ setimmediate () จะถูกบันทึกไว้ในรายการที่เชื่อมโยง
ในแง่ของพฤติกรรม process.nexttick () จะเรียกใช้ฟังก์ชั่นการโทรกลับทั้งหมดในอาร์เรย์ในแต่ละลูป
setimmediate () ดำเนินการฟังก์ชันการโทรกลับในรายการที่เชื่อมโยงในแต่ละลูป
การคัดลอกรหัสมีดังนี้:
// เพิ่ม 2 nexttick () ฟังก์ชั่นการโทรกลับ
process.nexttick (function () {
console.log ("Nexttick ล่าช้าการดำเนินการ 1");
-
process.nexttick (function () {
console.log ("Nexttick Delay Execution 2");
-
// เพิ่มฟังก์ชั่นการโทรกลับสอง setimmediate ()
setimmediate (function () {
console.log ("Setimmediate Delays Execution 1");
process.nexttick (function () {
console.log ("แทรกแรง");
-
-
setimmediate (function () {
console.log ("Setimmediate Delays Execution 2");
-
console.log ("การดำเนินการปกติ");
จากผลการดำเนินการจะเห็นได้ว่าเมื่อมีการเรียกใช้ฟังก์ชันการเรียกกลับ SetImmediate () ครั้งแรกที่สองจะไม่ถูกดำเนินการทันที แต่เข้าสู่รอบถัดไปของลูปและดำเนินการอีกครั้งในลำดับของลำดับความสำคัญ nexttick () เหตุผลสำหรับการออกแบบนี้คือเพื่อให้แน่ใจว่าแต่ละลูปสามารถดำเนินการได้อย่างรวดเร็วและป้องกันไม่ให้ CPU บริโภคมากเกินไปและปิดกั้นการโทร I/O ที่ตามมา
ข้างต้นคือข้อมูลเกี่ยวกับความแตกต่างระหว่าง nexttick () และ setimmediate () ใน node.js. คุณชัดเจนเกี่ยวกับความแตกต่างระหว่างพวกเขาหรือไม่?