โหวตให้กับโพสต์ถัดไปหรือพูดถึงสิ่งที่คุณต้องการเห็นต่อไปที่นี่:



หากคุณกำลังเรียนรู้หรือเริ่มต้นใช้งาน JavaScript ฉันสามารถพูดได้อย่างแน่นอนว่าคุณอาจเคยคิดว่า

“ฉันจะเขียนฟังก์ชันที่ไม่บล็อกแบบอะซิงโครนัสได้อย่างไร!”

มันเป็นคำถามที่พบบ่อยหรือเหมือนเป็นความอยากรู้อยากเห็นเมื่อเราดูโมดูล node.js ในตัว เช่น file system เป็นต้น

การดำเนินการแบบอะซิงโครนัสเป็นข้อดีประการหนึ่งของการใช้ JavaScript เนื่องจากเพื่อให้บรรลุการดำเนินการแบบอะซิงโครนัสใน Java, C ฯลฯ เราจำเป็นต้องใช้ Threads และเชื่อฉันเถอะว่า ____ เป็นเรื่องที่เจ็บปวด

แต่ใน JavaScript เราไม่จำเป็นต้องจัดการกับ Threads อย่างชัดเจน! JavaScript ใจดีพอที่จะดูแลมัน ☺

หากคุณไม่รู้ว่าอะไรเป็นแบบอะซิงโครนัส... คุณสามารถอ่านได้ว่า WTF เป็นแบบซิงโครนัสและอะซิงโครนัส!

ต่อไป…. ฉันจะรอที่นี่

ตกลง. ตอนนี้คุณรู้แล้วว่าการดำเนินการแบบซิงโครนัสและแบบอะซิงโครนัสคืออะไร มาทำความรู้จักกับ JavaScript กันดีกว่า!

ฟังก์ชันซิงโครนัส:

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

มันพิมพ์:

started
3
5
7
..
..
..
completed 1228
finished

เธรดเดี่ยว:

JavaScript เป็นสภาพแวดล้อมแบบเธรดเดียว! แม้แต่ node.js

ในสภาพแวดล้อมแบบเธรดเดียว สามารถเรียกใช้โค้ดได้เพียงส่วนเดียวในแต่ละครั้ง

พิจารณาตัวอย่างต่อไปนี้:

แม้ว่าตัวจัดการเหตุการณ์ทั้งสองจะทำงานบนเหตุการณ์การคลิก ตัวจัดการตัวที่สองจะไม่ทำงานจนกว่าคุณจะระบุชื่อของคุณให้กับพรอมต์และตัวจัดการตัวแรกทำงานเสร็จเรียบร้อยแล้ว

นอกจากนี้ เบราว์เซอร์จะไม่ตอบสนองต่อเหตุการณ์ใด ๆ ก็ตามในขณะที่ดำเนินการจัดการตัวแรกเสร็จแล้ว ท้ายที่สุด Javes(👮🏻‍♂️) ไม่สามารถรับโทรศัพท์ในขณะที่เขาเปิดประตูได้

งานลักษณะนี้ที่ Javes สนใจอย่างเต็มที่เรียกว่าการบล็อกหรือซิงโครนัส

ฟังก์ชันอะซิงโครนัส

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

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

การที่เบราว์เซอร์ล็อคไว้ในขณะที่เรารอสายจะเหมือนกับการที่ Javes รอที่ที่ทำการไปรษณีย์เพื่อตอบกลับโทรเลขทุกฉบับที่เขาส่ง เราไม่สามารถทำเช่นนั้นได้ เพราะเขามีงานที่ต้องทำ!

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

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

เราใช้ setTimeout( function(){} , 0 ); เพื่อสร้างฟังก์ชันอะซิงโครนัสใน JavaScript!

มันพิมพ์:

started
finished
3
5
7
..
..
..
completed 1228

วงเหตุการณ์

แล้ว Javes จะติดตามงานไหนต่อไปได้อย่างไร? ใน JavaScript รายการสิ่งที่ต้องทำของ Javes เรียกว่าลูปเหตุการณ์

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

ไม่มีทางแก้ไขได้สองทาง: เราจะต้องจ้างเลขานุการเพื่อช่วยจัดการรายการสิ่งที่ต้องทำของ Javes และคอยอัปเดตเมื่อมีงานใหม่ปรากฏขึ้น

ปรากฎว่านี่คือสิ่งที่เกิดขึ้นกับ JavaScript เช่นกัน: จริงๆ แล้วเอ็นจิ้น JavaScript มีเธรดพื้นหลังเพิ่มเติมซึ่งดูแลการจัดการลูปเหตุการณ์

ถึงกระนั้น รหัสของคุณก็จะทำงานในเธรดหลักเดียวเสมอ ดังนั้นจากมุมมองของโปรแกรมเมอร์ มันปลอดภัยที่จะบอกว่า JavaScript เป็นแบบเธรดเดียว

มีข้อสงสัย/คำถาม/ข้อเสนอแนะ? แสดงความคิดเห็นด้านล่าง