ความแตกต่างระหว่างการเขียนโปรแกรมแบบซิงโครนัสและแบบอะซิงโครนัสคืออะไร (ใน node.js)


189

ฉันอ่านnodebeginner แล้วฉันก็เจอโค้ดสองชิ้นต่อไปนี้

คนแรก:

    var result = database.query("SELECT * FROM hugetable");
    console.log("Hello World");

คนที่สอง:

    database.query("SELECT * FROM hugetable", function(rows) {
       var result = rows;
    });
    console.log("Hello World");

ฉันได้สิ่งที่ควรทำพวกเขาค้นหาฐานข้อมูลเพื่อดึงคำตอบของแบบสอบถาม console.log('Hello world')แล้วก็

คนแรกคือรหัสซิงโครนัสที่คาดคะเน และอันที่สองคือรหัสอะซิงโครนัส

ความแตกต่างระหว่างสองชิ้นนั้นค่อนข้างคลุมเครือสำหรับฉัน ผลผลิตจะเป็นอย่างไร

Googling ในการเขียนโปรแกรมแบบอะซิงโครนัสไม่ได้ช่วยฉันเช่นกัน


41
แสดงว่าคุณไม่พบอะไรกับ google มันเป็นเรื่องที่ค่อนข้างใหญ่ ในการโปรแกรมแบบซิงโครนัสแต่ละขั้นตอนจะดำเนินการอย่างใดอย่างหนึ่งหลังจากขั้นตอนก่อนหน้านี้เสร็จสิ้นการดำเนินการ ในแบบอะซิงโครนัสขั้นตอนที่ 2 จะดำเนินการแม้ว่าขั้นตอนที่ 1 จะไม่เสร็จสิ้น ฟังก์ชั่นที่คุณเห็นในตัวอย่างที่สองของคุณเรียกว่าฟังก์ชั่น callBack และจะทำงานทันทีที่ผลลัพธ์จากฐานข้อมูลจะถูกส่งกลับซึ่งอาจจะเป็นหลังจากที่ console.log ถูกรัน
Laurent S.

7
@Bartdude มีการเขียนโปรแกรมแบบอะซิงโครนัสมากมาย แต่ไม่มีคำอธิบายง่ายๆเกี่ยวกับสิ่งที่มันเป็นและความหมายในทางปฏิบัติ
Azeirah

1
@GabrielLlamas ทำไมเราควรหลีกเลี่ยงการทำงานแบบซิงโครนัส?
Charlie Parker

3
@CharlieParker เพราะพวกเขาปิดกั้นลูปเหตุการณ์และคุณสูญเสียผลประโยชน์ทั้งหมดจากโมเดล I / O ที่มีการซิงโครไนซ์เหตุการณ์ และเพราะมันเป็นการปฏิบัติที่ไม่ดี คิดแบบนี้: ถ้าคุณไม่ได้ใช้ฟังก์ชั่นอะซิงโครนัสทำไมคุณถึงใช้ Node.js?
Gabriel Llamas

1
@GabrielLlamas ถ้าฉันใช้คำสั่ง INSERT และฉันต้องการใช้ ID ที่แทรกล่าสุดหลังจากdatabase.query()นั้นฉันควรจะเรียกมันแบบซิงโครนัสใช่ไหม? หรือสิ่งที่ควรเป็นแนวทาง? (คำถามนี้ฉันมีมานานแล้ว)
San

คำตอบ:


225

ความแตกต่างคือในตัวอย่างแรกโปรแกรมจะบล็อกในบรรทัดแรก บรรทัดถัดไป ( console.log) จะต้องรอ

ในตัวอย่างที่สองที่console.logจะดำเนินการในขณะที่แบบสอบถามจะถูกประมวลผล นั่นคือแบบสอบถามจะถูกประมวลผลในพื้นหลังในขณะที่โปรแกรมของคุณกำลังทำสิ่งอื่น ๆ และเมื่อข้อมูลแบบสอบถามพร้อมคุณจะทำทุกอย่างที่คุณต้องการ

โดยสังเขป: ตัวอย่างแรกจะปิดกั้นในขณะที่สองจะไม่

ผลลัพธ์ของสองตัวอย่างต่อไปนี้:

// Example 1 - Synchronous (blocks)
var result = database.query("SELECT * FROM hugetable");
console.log("Query finished");
console.log("Next line");


// Example 2 - Asynchronous (doesn't block) 
database.query("SELECT * FROM hugetable", function(result) {
    console.log("Query finished");
});
console.log("Next line");

อยากจะเป็น:

  1. Query finished
    Next line
  2. Next line
    Query finished

หมายเหตุ
ขณะที่โหนดเองเป็นเธรดเดี่ยวมีงานบางอย่างที่สามารถทำงานแบบขนานได้ ตัวอย่างเช่นการทำงานของระบบไฟล์เกิดขึ้นในกระบวนการอื่น

นั่นเป็นสาเหตุที่โหนดสามารถทำการดำเนินการแบบ async: หนึ่งเธรดกำลังทำการดำเนินการของระบบไฟล์ ในเซิร์ฟเวอร์ที่ขับเคลื่อนด้วยเหตุการณ์เช่นโหนดเธรดระบบไฟล์จะแจ้งเธรดโหนดหลักของเหตุการณ์บางอย่างเช่นเสร็จสิ้นล้มเหลวหรือดำเนินการพร้อมกับข้อมูลใด ๆ ที่เกี่ยวข้องกับเหตุการณ์นั้น (เช่นผลลัพธ์ของแบบสอบถามฐานข้อมูลหรือข้อผิดพลาด ข้อความ) และเธรดโหนดหลักตัดสินใจว่าจะทำอย่างไรกับข้อมูลนั้น

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ที่นี่: วิธีการทำงานของ IO แบบเธรดที่ไม่บล็อกเธรดเดียวใน Node.js


9
โดยพื้นฐานแล้วเมื่อฉันรันโค้ดชิ้นแรกมันจะทำอะไรแบบนี้: request query.; 5 seconds later when the request is done; console.log; เมื่อคนที่สองดำเนินการ: request query; console.log; work on the query;
Azeirah

1
@ JohnGalt sql ทำงานบนเธรดอื่น แต่แน่นอนว่าขึ้นอยู่กับการใช้งานไดรเวอร์ SQL ที่คุณใช้ ไดรเวอร์ควรวางไข่เธรดใหม่เชื่อมต่อกับ mysql และเรียกใช้แบบสอบถาม เมื่อเสร็จแล้วโพสต์ผลลัพธ์ไปยังคิวเหตุการณ์และโหนดจะโทรกลับ
Salvatorelab

4
เป็นไปได้หรือไม่ที่ตัวอย่าง async จะแสดงผลลัพธ์ในลักษณะเดียวกับ # 1 เช่นdatabase.queryเสร็จเร็วจนเมื่อถึงเวลาที่เราconsole.logทำภารกิจเสร็จเรียบร้อยแล้ว
greatwolf

2
@TheBronx ถ้าconsole.log("Next line");ในตัวอย่างที่ 2 อยู่ในฟังก์ชั่นที่ไม่ระบุชื่อดังนั้นหลังจากconsole.log("query finished");นั้นนั่นหมายถึง "บรรทัดถัดไป" จะถูกพิมพ์หลังจาก "แบบสอบถามเสร็จ" ใช่ไหม? ดังนั้นถ้าฉันมีทุกอย่างในแบบซ้อนกันทุกอย่างจะทำงานในแบบซิงโครนัสดังนั้นฉันไม่จำเป็นต้องกังวลเกี่ยวกับการใช้ฟังก์ชันบางอย่างในแบบซิงโครนัส ฉันถูกต้องในการทำความเข้าใจของฉัน?
Abdul

4
คำตอบสั้น ๆ : ใช่ @Abdul คุณพูดถูก คำตอบยาว : ฟังก์ชั่นการทำรัง (เรียกกลับ) เป็นวิธีการทำสิ่งต่าง ๆ ตามลำดับ "หนึ่งต่อกัน" แต่นั่นไม่ใช่เทคนิค "แบบซิงโครนัส" ฟังก์ชั่นที่ไม่ระบุชื่อจะยังคงดำเนินการ "เมื่อการดำเนินการบล็อกเสร็จสิ้น" หรือกล่าวอีกนัยหนึ่งว่า "อะซิงโครนัส" Node.js สามารถใช้งานฟังก์ชั่นอื่น ๆ ได้ในขณะที่กำลังทำการบล็อก ฟังก์ชั่นยังคงเป็นแบบซิงค์เพียงแค่คุณกำลังผูกมัดพวกเขา ฟังก์ชั่นซิงค์บล็อกการทำงานนั่นคือกุญแจสำคัญ
Salvatorelab

75

ความแตกต่างระหว่างสองแนวทางนี้มีดังนี้:

วิธีการซิงโครนัส: มันรอให้การดำเนินการแต่ละครั้งเสร็จสมบูรณ์หลังจากนั้นจะทำการดำเนินการครั้งต่อไปเท่านั้น สำหรับการสืบค้นของคุณ: console.log()คำสั่งจะไม่ถูกดำเนินการจนกว่า & ถ้าแบบสอบถามไม่ได้ดำเนินการเสร็จสิ้นเพื่อรับผลลัพธ์ทั้งหมดจากฐานข้อมูล

วิธีแบบอะซิงโครนัส: มันไม่เคยรอให้การดำเนินการแต่ละครั้งเสร็จสมบูรณ์ แต่จะเรียกใช้การดำเนินการทั้งหมดใน GO แรกเท่านั้น ผลลัพธ์ของการดำเนินการแต่ละครั้งจะได้รับการจัดการเมื่อผลลัพธ์พร้อมใช้งาน สำหรับการค้นหาของคุณ: console.log()คำสั่งจะถูกดำเนินการในไม่ช้าหลังจากDatabase.Query()วิธีการ ในขณะที่แบบสอบถามฐานข้อมูลทำงานในพื้นหลังและโหลดผลลัพธ์เมื่อเสร็จสิ้นการดึงข้อมูล

ใช้กรณี

  1. หากการดำเนินการของคุณไม่ยกอย่างหนักเช่นการสืบค้นข้อมูลขนาดใหญ่จากฐานข้อมูลให้ดำเนินการต่อด้วยวิธีการซิงโครนัสหรือวิธีอะซิงโครนัส

  2. ในแบบอะซิงโครนัสคุณสามารถแสดงตัวบ่งชี้ความคืบหน้าบางอย่างกับผู้ใช้ในขณะที่อยู่ในพื้นหลังคุณสามารถทำงานหนักต่อไปได้ นี่เป็นสถานการณ์ที่เหมาะสำหรับแอพ GUI


2
หมายความว่า db.query (cmd, callback) กำลังทำงานพร้อมกัน (เหมือนในเธรด) หรือไม่ พวกเขากำลังทำงานในเวลาเดียวกัน?
Charlie Parker

ในตัวอย่างที่สองของเขามีความเป็นไปได้ไหมที่แบบสอบถามจะเสร็จเร็วมากจนโทรไปก่อนได้console.logหรือไม่
Fahmi

@Fahmi ตามหลักวิชาใช่แล้วเป็นไปไม่ได้เลยทีเดียว
Leo Messi

24

สิ่งนี้จะชัดเจนขึ้นอีกเล็กน้อยถ้าคุณเพิ่มบรรทัดลงในทั้งสองตัวอย่าง:

var result = database.query("SELECT * FROM hugetable");
console.log(result.length);
console.log("Hello World");

คนที่สอง:

database.query("SELECT * FROM hugetable", function(rows) {
   var result = rows;
   console.log(result.length);
});
console.log("Hello World");

ลองใช้สิ่งเหล่านี้แล้วคุณจะสังเกตเห็นว่าตัวอย่างแรก (ซิงโครนัส) ผลลัพธ์จะมีการพิมพ์ความยาวก่อนที่จะถึงบรรทัด 'Hello World' ในตัวอย่างที่สอง (แบบอะซิงโครนัส) ผลลัพธ์ของความยาวจะพิมพ์ออกมาหลังจากบรรทัด "Hello World"

นั่นเป็นเพราะในตัวอย่างที่สองการdatabase.queryรันแบบอะซิงโครนัสในพื้นหลังและสคริปต์ยังคงดำเนินต่อไปด้วย "Hello World" console.log(result.length)จะถูกดำเนินการเฉพาะเมื่อการสืบค้นฐานข้อมูลได้เสร็จสิ้น


1
ที่คุณพูดว่า: result.length จะ(ส่วนใหญ่มีแนวโน้ม)จะพิมพ์หลังเส้น "Hello World" .... ทำไมถึงเป็น "น่าจะ" มากที่สุด? ฉันคิดว่ามันมักจะพิมพ์หลังจากเอาท์พุท console.log ขอบคุณสำหรับการชี้แจง :)
มนุษยชาติ

9
@humanityANDpeace: นั่นเป็นจุดรวมของการเข้าถึงแบบอะซิงโครนัส: คุณไม่รู้ว่ามันจะเสร็จเมื่อไหร่ บางทีมันอาจเป็นฐานข้อมูลที่รวดเร็วอย่างไร้สาระและแบบสอบถามฐานข้อมูลจะส่งคืนแม้กระทั่งก่อนที่ Javascript จะเข้าสู่บรรทัด "Hello World" ...
Martijn

19

ก่อนอื่นฉันรู้ว่าฉันมาสายในการตอบคำถามนี้

ก่อนพูดคุยเรื่องซิงโครนัสและอะซิงโครนัสขอให้เราดูว่าโปรแกรมทำงานอย่างไร

ในกรณีแบบซิงโครนัสแต่ละคำสั่งเสร็จสมบูรณ์ก่อนที่จะเรียกใช้คำสั่งถัดไป ในกรณีนี้โปรแกรมจะได้รับการประเมินตามคำสั่ง

นี่คือการทำงานแบบอะซิงโครนัสใน JavaScript ในเอ็นจิ้น JavaScript มีสองส่วนส่วนหนึ่งที่ดูรหัสและการเข้าคิวการดำเนินการและอีกส่วนหนึ่งที่ประมวลผลคิว การประมวลผลคิวเกิดขึ้นในหนึ่งเธรดนั่นคือเหตุผลที่การดำเนินการเพียงครั้งเดียวสามารถเกิดขึ้นได้ในแต่ละครั้ง

เมื่อการดำเนินการแบบอะซิงโครนัส (เช่นแบบสอบถามฐานข้อมูลที่สอง) เห็นรหัสจะถูกแยกวิเคราะห์และการดำเนินการจะอยู่ในคิว แต่ในกรณีนี้การลงทะเบียนโทรกลับจะถูกเรียกใช้เมื่อการดำเนินการนี้เสร็จสมบูรณ์ คิวอาจมีการดำเนินการหลายอย่างอยู่แล้ว การดำเนินการที่ด้านหน้าของคิวถูกประมวลผลและลบออกจากคิว เมื่อการดำเนินการสำหรับการสืบค้นฐานข้อมูลถูกประมวลผลคำขอจะถูกส่งไปยังฐานข้อมูลและเมื่อดำเนินการติดต่อกลับเสร็จสิ้นจะดำเนินการให้เสร็จสิ้น ในเวลานี้ตัวประมวลผลคิวที่มี "จัดการ" การดำเนินการจะย้ายไปที่การดำเนินการถัดไป - ในกรณีนี้

    console.log("Hello World"); 

แบบสอบถามฐานข้อมูลยังคงอยู่ในระหว่างดำเนินการ แต่การดำเนินการ console.log อยู่ที่ด้านหน้าของคิวและรับการประมวลผล นี่เป็นการดำเนินการแบบซิงโครนัสที่เกิดขึ้นทันทีในผลลัพธ์ "Hello World" บางครั้งในภายหลังการดำเนินการฐานข้อมูลจะดำเนินการเสร็จสิ้นจากนั้นการเรียกกลับที่ลงทะเบียนกับแบบสอบถามจะถูกเรียกใช้และประมวลผลการตั้งค่าผลลัพธ์ของตัวแปรเป็นแถว

เป็นไปได้ว่าการดำเนินการแบบอะซิงโครนัสหนึ่งครั้งจะส่งผลให้เกิดการดำเนินการแบบอะซิงโครนัสอีกครั้งการดำเนินการที่สองนี้จะถูกใส่ในคิวและเมื่อมาถึงด้านหน้าของคิวที่จะถูกประมวลผล การโทรกลับที่ลงทะเบียนด้วยการดำเนินการแบบอะซิงโครนัสคือวิธีที่เวลารัน JavaScript ส่งคืนผลลัพธ์ของการดำเนินการเมื่อเสร็จสิ้น

วิธีง่าย ๆ ในการรู้ว่าการใช้งาน JavaScript แบบใดที่ไม่ตรงกันคือต้องทราบว่าต้องใช้การติดต่อกลับหรือไม่การโทรกลับเป็นรหัสที่จะถูกเรียกใช้เมื่อการดำเนินการครั้งแรกเสร็จสิ้น ในสองตัวอย่างในคำถามเราสามารถดูได้เฉพาะกรณีที่สองเท่านั้นที่มีการเรียกกลับดังนั้นจึงเป็นการดำเนินการแบบอะซิงโครนัสของทั้งสอง มันไม่ได้เป็นเช่นนั้นเสมอไปเพราะรูปแบบที่แตกต่างกันของการจัดการผลลัพธ์ของการดำเนินการแบบอะซิงโครนัส

หากต้องการเรียนรู้เพิ่มเติมอ่านเกี่ยวกับสัญญา สัญญาเป็นอีกวิธีหนึ่งที่ผลลัพธ์ของการดำเนินการแบบอะซิงโครนัสสามารถจัดการได้ สิ่งที่ดีเกี่ยวกับสัญญาคือสไตล์การเขียนโค้ดรู้สึกเหมือนรหัสซิงโครนัส

ไลบรารีจำนวนมากเช่น node 'fs' ให้ทั้งสไตล์ซิงโครนัสและอะซิงโครนัสสำหรับการดำเนินการบางอย่าง ในกรณีที่การดำเนินการใช้เวลาไม่นานและไม่ได้ใช้งานมากเช่นในกรณีที่อ่านไฟล์กำหนดค่าการดำเนินการสไตล์ซิงโครนัสจะส่งผลให้โค้ดอ่านง่ายขึ้น


6

ในกรณีแบบซิงโครนัสคำสั่ง console.log จะไม่ถูกดำเนินการจนกว่าแบบสอบถาม SQL จะดำเนินการเสร็จสิ้น

ในกรณีแบบอะซิงโครนัสคำสั่ง console.log จะถูกดำเนินการโดยตรง ผลลัพธ์ของแบบสอบถามจะถูกเก็บไว้โดยฟังก์ชัน "เรียกกลับ" ในภายหลัง


1
แต่ความจริงแล้วถูกเรียกพร้อมกันไหม? สิ่งที่ทำให้ฉันสับสนคือในโค้ดอะซิงโครนัสคือรหัสจริงที่ทำงานพร้อมกันหรือไม่?
Charlie Parker

ขึ้นอยู่กับโปรเซสเซอร์ (มันเป็นมัลติคอร์หรือไม่) และระบบปฏิบัติการ ดูen.wikipedia.org/wiki/Multithreading_(software)#Multithreading
ที่เกี่ยวข้อง

4

ความแตกต่างที่สำคัญคือการเขียนโปรแกรมแบบอะซิงโครนัสคุณจะไม่หยุดการทำงานเป็นอย่างอื่น คุณสามารถรันโค้ดอื่นต่อได้ในขณะที่ 'คำขอ' กำลังถูกสร้างขึ้น


2

ฟังก์ชั่นทำให้หนึ่งที่สองไม่ตรงกัน

โปรแกรมแรกบังคับให้โปรแกรมรอให้แต่ละบรรทัดทำงานจนเสร็จก่อนที่โปรแกรมถัดไปจะทำงานต่อได้ บรรทัดที่สองอนุญาตให้แต่ละบรรทัดทำงานร่วมกัน (และเป็นอิสระ) ในครั้งเดียว

ภาษาและกรอบงาน (js, node.js) ที่อนุญาตแบบอะซิงโครนัสหรือการทำงานพร้อมกันนั้นยอดเยี่ยมสำหรับสิ่งที่ต้องการการส่งแบบเรียลไทม์ (เช่นการแชทแอปพลิเคชันสต็อค)


0

การเขียนโปรแกรมซิงค์

ภาษาการเขียนโปรแกรมเช่น C, C #, Java เป็นการเขียนโปรแกรมซิงค์สิ่งที่คุณเขียนจะถูกดำเนินการตามลำดับการเขียนของคุณ

-GET DATA FROM SQL.
//Suppose fetching data take 500 msec

-PERFORM SOME OTHER FUNCTION.
//Performing some function other will take 100 msec, but execution of other 
//task start only when fetching of sql data done (i.e some other function 
//can execute only after first in process job finishes).

-TOTAL TIME OF EXECUTION IS ALWAYS GREATER THAN (500 + 100 + processing time) 
msec

async

NodeJs มาพร้อมกับคุณสมบัติ async มันไม่ได้ปิดกั้นในลักษณะสมมติว่าในงาน I / O ใด ๆ ที่ต้องใช้เวลา (ดึง, เขียน, อ่าน), nodejs จะไม่ได้ใช้งานและรอให้งานเสร็จสิ้น ' จะเริ่มดำเนินการงานต่อไปในคิวและเมื่อใดก็ตามที่การรับงานเสร็จสมบูรณ์จะแจ้งให้ทราบโดยใช้การโทรกลับ ตัวอย่างต่อไปนี้จะช่วย:

//Nodejs uses callback pattern to describe functions.
//Please read callback pattern to understand this example

//Suppose following function (I/O involved) took 500 msec
function timeConsumingFunction(params, callback){
  //GET DATA FROM SQL
  getDataFromSql(params, function(error, results){
    if(error){
      callback(error);
    }
    else{
      callback(null, results);
    }
  })
}

//Suppose following function is non-blocking and took 100 msec
function someOtherTask(){
  //some other task
  console.log('Some Task 1');
  console.log('Some Task 2');
}

console.log('Execution Start');

//Start With this function
timeConsumingFunction(params, function(error, results){
    if(error){
      console.log('Error')
    }
    else{
      console.log('Successfull'); 
    }
  })

//As (suppose) timeConsumingFunction took 500 msec, 
//As NodeJs is non-blocking, rather than remain idle for 500 msec, it will start 
//execute following function immediately
someOtherTask();

ในระยะสั้นเอาท์พุทเป็นดังนี้:

Execution Start
//Roughly after 105 msec (5 msec it'll take in processing)
Some Task 1
Some Task 2
//Roughly After 510 msec
Error/Successful //depends on success and failure of DB function execution

ความแตกต่างนั้นชัดเจนว่าการซิงค์จะใช้เวลามากกว่า 600 (500 + 100 + เวลาประมวลผล) msec แน่นอน async ช่วยประหยัดเวลา


0

ฟังก์ชันซิงโครนัสกำลังบล็อกขณะที่ฟังก์ชันอะซิงโครนัสไม่ใช่ ในฟังก์ชั่นแบบซิงโครนัสคำสั่งสมบูรณ์ก่อนที่จะเรียกใช้คำสั่งถัดไป ในกรณีนี้โปรแกรมจะถูกประเมินตามลำดับของคำสั่งและการดำเนินการของโปรแกรมจะหยุดชั่วคราวหากหนึ่งในคำสั่งนั้นใช้เวลานานมาก

ฟังก์ชั่นอะซิงโครนัสมักจะยอมรับการเรียกกลับเป็นพารามิเตอร์และการดำเนินการต่อไปในบรรทัดถัดไปทันทีหลังจากที่มีการเรียกใช้ฟังก์ชั่นอะซิงโครนัส การเรียกกลับถูกเรียกใช้เฉพาะเมื่อการดำเนินการแบบอะซิงโครนัสเสร็จสมบูรณ์และสแตกการโทรว่างเปล่า การดำเนินงานที่หนักเช่นการโหลดข้อมูลจากเว็บเซิร์ฟเวอร์หรือการสืบค้นฐานข้อมูลควรทำแบบอะซิงโครนัสเพื่อให้เธรดหลักสามารถดำเนินการการดำเนินการอื่นต่อไปแทนที่จะปิดกั้นจนกว่าการดำเนินการที่ยาวนานจะเสร็จสมบูรณ์ (ในกรณีของเบราว์เซอร์ .

Orginal โพสต์บน Github: ลิงก์


0

การเขียนโปรแกรมแบบอะซิงโครนัสใน JS:

พร้อมกัน

  • หยุดการทำงานของรหัสเพิ่มเติมจนกว่าจะเสร็จสิ้น
  • เพราะนี่เป็นการหยุดการทำงานครั้งต่อไปรหัสซิงโครนัสจึงถูกเรียกว่า "การบล็อก" การบล็อกในแง่ที่จะไม่มีการเรียกใช้รหัสอื่น

ไม่ตรงกัน

  • การดำเนินการนี้ถูกเลื่อนออกไปเป็นเหตุการณ์ลูปนี่คือโครงสร้างในเครื่องเสมือน JS ซึ่งดำเนินการฟังก์ชันอะซิงโครนัส (หลังจากสแต็กของฟังก์ชันซิงโครนัสว่างเปล่า)
  • รหัสแบบอะซิงโครนัสเรียกว่าการปิดกั้นเนื่องจากไม่ได้ปิดกั้นการเรียกใช้รหัสเพิ่มเติม

ตัวอย่าง:

// This function is synchronous
function log(arg) {
    console.log(arg)
}

log(1);

// This function is asynchronous
setTimeout(() => {
    console.log(2)
}, 0);

log(3)

  • ตัวอย่างบันทึก 1, 3, 2
  • 2 ถูกบันทึกครั้งสุดท้ายเพราะมันอยู่ในฟังก์ชั่นแบบอะซิงโครนัสซึ่งจะถูกดำเนินการหลังจากที่สแต็กว่างเปล่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.