ฉันกำลังคิดถึงมันและนี่คือสิ่งที่ฉันคิดขึ้นมา:
ลองดูโค้ดด้านล่างนี้:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
มีคำขอเข้ามาและเอ็นจิน JS เริ่มดำเนินการโค้ดด้านบนทีละขั้นตอน สองสายแรกคือสายซิงค์ แต่เมื่อพูดถึงsetTimeout
วิธีการมันจะกลายเป็นการดำเนินการแบบ async แต่ JS กลับมาจากมันทันทีและดำเนินการต่อซึ่งเรียกว่าNon-Blocking
หรือAsync
. และมันยังคงทำงานอื่น ๆ
ผลลัพธ์ของการดำเนินการนี้มีดังต่อไปนี้:
acdb
โดยพื้นฐานแล้วครั้งที่สองsetTimeout
จะเสร็จสิ้นก่อนและฟังก์ชันเรียกกลับของมันจะถูกเรียกใช้งานเร็วกว่าฟังก์ชันแรกและนั่นก็สมเหตุสมผล
เรากำลังพูดถึงแอปพลิเคชันเธรดเดียวที่นี่ JS Engine ยังคงดำเนินการสิ่งนี้ต่อไปและเว้นแต่ว่าจะเสร็จสิ้นคำขอแรกจะไม่ไปที่คำขอที่สอง แต่สิ่งที่ดีคือมันจะไม่รอให้การดำเนินการบล็อกเหมือนsetTimeout
จะแก้ไขดังนั้นมันจะเร็วกว่าเพราะยอมรับคำขอที่เข้ามาใหม่
แต่คำถามของฉันเกิดขึ้นจากรายการต่อไปนี้:
# 1:หากเรากำลังพูดถึงแอปพลิเคชันแบบเธรดเดียวกลไกใดที่ประมวลผลsetTimeouts
ในขณะที่เอ็นจิ้น JS ยอมรับคำขอเพิ่มเติมและดำเนินการ เธรดเดี่ยวทำงานต่อไปยังคำขออื่น ๆ อย่างไร สิ่งที่ใช้ได้ผลในsetTimeout
ขณะที่คำขออื่นเข้ามาและดำเนินการ
# 2:หากsetTimeout
ฟังก์ชันเหล่านี้ถูกเรียกใช้งานเบื้องหลังในขณะที่มีคำขอเข้ามาและกำลังดำเนินการมากขึ้นสิ่งที่ดำเนินการประมวลผลแบบ async อยู่เบื้องหลัง? สิ่งที่เราพูดถึงนี้เรียกว่าEventLoop
อะไร?
# 3:แต่ไม่ควรใส่วิธีการทั้งหมดEventLoop
เพื่อให้สิ่งทั้งหมดถูกดำเนินการและเรียกวิธีการโทรกลับ? นี่คือสิ่งที่ฉันเข้าใจเมื่อพูดถึงฟังก์ชันการโทรกลับ:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
แต่ในกรณีนี้ JS Engine จะรู้ได้อย่างไรว่าเป็นฟังก์ชัน async เพื่อให้สามารถเรียกกลับได้EventLoop
หรือไม่? บางทีบางอย่างเช่นasync
คำสำคัญใน C # หรือแอตทริบิวต์บางประเภทที่ระบุว่าวิธีการที่ JS Engine จะใช้นั้นเป็นวิธีการแบบ async และควรได้รับการปฏิบัติตามนั้น
# 4:แต่บทความพูดค่อนข้างตรงกันข้ามกับสิ่งที่ฉันคาดเดาว่าสิ่งต่างๆจะทำงานอย่างไร:
Event Loop คือคิวของฟังก์ชันเรียกกลับ เมื่อฟังก์ชัน async ทำงานฟังก์ชันเรียกกลับจะถูกผลักเข้าไปในคิว เอ็นจิ้น JavaScript ไม่เริ่มประมวลผลการวนรอบเหตุการณ์จนกว่าโค้ดหลังจากที่ฟังก์ชัน async ทำงานแล้ว
# 5:และมีภาพนี้อยู่ที่นี่ซึ่งอาจเป็นประโยชน์ แต่คำอธิบายแรกในภาพบอกว่าสิ่งเดียวกับที่กล่าวถึงในคำถามข้อ 4:
ดังนั้นคำถามของฉันที่นี่คือการได้รับคำชี้แจงเกี่ยวกับรายการข้างต้น?