ก่อนอื่นฉันรู้ว่าฉันมาสายในการตอบคำถามนี้
ก่อนพูดคุยเรื่องซิงโครนัสและอะซิงโครนัสขอให้เราดูว่าโปรแกรมทำงานอย่างไร
ในกรณีแบบซิงโครนัสแต่ละคำสั่งเสร็จสมบูรณ์ก่อนที่จะเรียกใช้คำสั่งถัดไป ในกรณีนี้โปรแกรมจะได้รับการประเมินตามคำสั่ง
นี่คือการทำงานแบบอะซิงโครนัสใน JavaScript ในเอ็นจิ้น JavaScript มีสองส่วนส่วนหนึ่งที่ดูรหัสและการเข้าคิวการดำเนินการและอีกส่วนหนึ่งที่ประมวลผลคิว การประมวลผลคิวเกิดขึ้นในหนึ่งเธรดนั่นคือเหตุผลที่การดำเนินการเพียงครั้งเดียวสามารถเกิดขึ้นได้ในแต่ละครั้ง
เมื่อการดำเนินการแบบอะซิงโครนัส (เช่นแบบสอบถามฐานข้อมูลที่สอง) เห็นรหัสจะถูกแยกวิเคราะห์และการดำเนินการจะอยู่ในคิว แต่ในกรณีนี้การลงทะเบียนโทรกลับจะถูกเรียกใช้เมื่อการดำเนินการนี้เสร็จสมบูรณ์ คิวอาจมีการดำเนินการหลายอย่างอยู่แล้ว การดำเนินการที่ด้านหน้าของคิวถูกประมวลผลและลบออกจากคิว เมื่อการดำเนินการสำหรับการสืบค้นฐานข้อมูลถูกประมวลผลคำขอจะถูกส่งไปยังฐานข้อมูลและเมื่อดำเนินการติดต่อกลับเสร็จสิ้นจะดำเนินการให้เสร็จสิ้น ในเวลานี้ตัวประมวลผลคิวที่มี "จัดการ" การดำเนินการจะย้ายไปที่การดำเนินการถัดไป - ในกรณีนี้
console.log("Hello World");
แบบสอบถามฐานข้อมูลยังคงอยู่ในระหว่างดำเนินการ แต่การดำเนินการ console.log อยู่ที่ด้านหน้าของคิวและรับการประมวลผล นี่เป็นการดำเนินการแบบซิงโครนัสที่เกิดขึ้นทันทีในผลลัพธ์ "Hello World" บางครั้งในภายหลังการดำเนินการฐานข้อมูลจะดำเนินการเสร็จสิ้นจากนั้นการเรียกกลับที่ลงทะเบียนกับแบบสอบถามจะถูกเรียกใช้และประมวลผลการตั้งค่าผลลัพธ์ของตัวแปรเป็นแถว
เป็นไปได้ว่าการดำเนินการแบบอะซิงโครนัสหนึ่งครั้งจะส่งผลให้เกิดการดำเนินการแบบอะซิงโครนัสอีกครั้งการดำเนินการที่สองนี้จะถูกใส่ในคิวและเมื่อมาถึงด้านหน้าของคิวที่จะถูกประมวลผล การโทรกลับที่ลงทะเบียนด้วยการดำเนินการแบบอะซิงโครนัสคือวิธีที่เวลารัน JavaScript ส่งคืนผลลัพธ์ของการดำเนินการเมื่อเสร็จสิ้น
วิธีง่าย ๆ ในการรู้ว่าการใช้งาน JavaScript แบบใดที่ไม่ตรงกันคือต้องทราบว่าต้องใช้การติดต่อกลับหรือไม่การโทรกลับเป็นรหัสที่จะถูกเรียกใช้เมื่อการดำเนินการครั้งแรกเสร็จสิ้น ในสองตัวอย่างในคำถามเราสามารถดูได้เฉพาะกรณีที่สองเท่านั้นที่มีการเรียกกลับดังนั้นจึงเป็นการดำเนินการแบบอะซิงโครนัสของทั้งสอง มันไม่ได้เป็นเช่นนั้นเสมอไปเพราะรูปแบบที่แตกต่างกันของการจัดการผลลัพธ์ของการดำเนินการแบบอะซิงโครนัส
หากต้องการเรียนรู้เพิ่มเติมอ่านเกี่ยวกับสัญญา สัญญาเป็นอีกวิธีหนึ่งที่ผลลัพธ์ของการดำเนินการแบบอะซิงโครนัสสามารถจัดการได้ สิ่งที่ดีเกี่ยวกับสัญญาคือสไตล์การเขียนโค้ดรู้สึกเหมือนรหัสซิงโครนัส
ไลบรารีจำนวนมากเช่น node 'fs' ให้ทั้งสไตล์ซิงโครนัสและอะซิงโครนัสสำหรับการดำเนินการบางอย่าง ในกรณีที่การดำเนินการใช้เวลาไม่นานและไม่ได้ใช้งานมากเช่นในกรณีที่อ่านไฟล์กำหนดค่าการดำเนินการสไตล์ซิงโครนัสจะส่งผลให้โค้ดอ่านง่ายขึ้น