ฉันเคยเจอคำนี้บ่อยมากและแม้กระทั่งหลังจาก Googling ก็ยังไม่เข้าใจว่ามันหมายถึงอะไร มีคำจำกัดความที่เข้าใจง่าย (อย่างดีพร้อมตัวอย่าง) ของเหตุการณ์แบบอะซิงโครนัสที่ใครบางคนสามารถให้ได้หรือไม่?
ขอบคุณ!
ฉันเคยเจอคำนี้บ่อยมากและแม้กระทั่งหลังจาก Googling ก็ยังไม่เข้าใจว่ามันหมายถึงอะไร มีคำจำกัดความที่เข้าใจง่าย (อย่างดีพร้อมตัวอย่าง) ของเหตุการณ์แบบอะซิงโครนัสที่ใครบางคนสามารถให้ได้หรือไม่?
ขอบคุณ!
คำตอบ:
ตัวอย่างที่ไม่ใช่การเขียนโปรแกรม:
ซิงโครนัส คุณต้องการพิซซ่าเป็นอาหารเย็นและคุณไม่ได้อยู่ในประเภทแช่แข็ง ดังนั้นคุณต้องหยุดเล่น WOW ที่ทำให้กิลด์ของคุณแย่ลง คุณไปที่ห้องครัวทำแป้งปิดด้วยซอสเพิ่มชีสและเบคอนราดหน้าที่คุณชื่นชอบ คุณใช้เวลาเพียง 20 นาทีในการทำพิซซ่าและอีก 10 นาทีในเตาอบ ตัวจับเวลาจะส่งเสียงบี๊บและคุณดึงพายร้อนออก คุณสามารถนั่งลงหน้าคอมพิวเตอร์กินพิซซ่าและดำเนินการจู่โจมต่อได้
ไม่ตรงกัน คุณต้องการพิซซ่าเป็นอาหารค่ำในขณะที่เล่น WOW คุณเปิดหน้าต่างเบราว์เซอร์บนจอภาพที่ 5 ของคุณ คุณโหลดเว็บไซต์ Pizza และสั่งพิซซ่าเบคอนแสนอร่อยพร้อมซอสกระเทียมเบคอน คุณกลับไปที่การจู่โจมของคุณและหลังจากผ่านไป 20 นาทีกริ่งประตูก็ดังขึ้น คุณได้รับพิซซ่า คุณนั่งลงหน้าคอมพิวเตอร์กินพิซซ่าและดำเนินการจู่โจมต่อ
แล้วอะไรคือความแตกต่าง? วิธีหนึ่งที่คุณเสียเวลาไปกับการว้าวอันมีค่า 20-30 นาทีและอีกวิธีหนึ่งที่คุณเสียไป $ 20 บวกทิป
เพจของคุณถูกส่งจากเซิร์ฟเวอร์ไปยังเบราว์เซอร์ไคลเอนต์บางแห่งในอินเทอร์เน็ต เบราว์เซอร์ได้วาดหน้าบนหน้าจอและมีใครบางคนหรือบางสิ่งกำลังดูอยู่ มันเป็นเกมที่รอคอย สายตาเลื่อนไปมาโดยใช้รายละเอียดนี้หรือรายละเอียดนั้นด้วยการกระโดดอย่างรวดเร็วโดยพุ่งไปด้านข้างในขณะนี้จากนั้นให้ห่างจากหน้าจอเพื่อตรวจสอบสิ่งรบกวนในสภาพแวดล้อม นาฬิกาบอกเวลา หน้าจะสว่างขึ้นอย่างนุ่มนวลเฉยเมยเมื่อผู้ใช้เลื่อนเมาส์ไปวางบนเมาส์อย่างไม่ระมัดระวังคอก้มลงและจ้องมองสิ่งที่เชิญชวนที่เพจของคุณนำเสนอมากขึ้นเรื่อย ๆ
ทันใดนั้นเคอร์เซอร์ก็เริ่มขยับโดยไม่มีการเตือนใด ๆ ในขณะที่มือบนเมาส์แข็งขึ้นเล็กน้อยและเริ่มขยับกระแทกพลาสติกเล็ก ๆ บนพื้นผิวขรุขระของโต๊ะ ในขณะที่เมาส์เคลื่อนที่ตัวแทนของมันบนหน้าจอจะเคลื่อนไหวเลียนแบบอย่างใกล้ชิดลากผ่านรูปภาพที่น่าสนใจและคำพูดที่มีไหวพริบในเนื้อหาของเพจของคุณ ในที่สุดการตัดสินใจจะเกิดขึ้นการเคลื่อนไหวหยุดชั่วคราวกล้ามเนื้อหรือสองหดเล็กน้อยและกดปุ่มเมาส์ด้วยนิ้วที่ยืนหยัด ไมโครสวิทช์ในเมาส์จะกระตุ้นให้เกิดแรงกระตุ้นทางอิเล็กทรอนิกส์และทันใดนั้นเบราว์เซอร์ก็ทราบว่าเกิดอะไรขึ้น: การคลิกเมาส์
ทั้งหมดนั้นทุกอย่างเกี่ยวกับสิ่งที่ผู้ใช้ทำในขณะที่จ้องที่หน้านั้นเกิดขึ้นในลักษณะที่ไม่สามารถคาดเดาได้โดยสิ้นเชิงกับเบราว์เซอร์โค้ดไคลเอนต์ใด ๆ ในหน้าเว็บของคุณไปจนถึงสิ่งที่อยู่บนเซิร์ฟเวอร์ ไม่มี "เวลารอ" ที่ทราบได้ระหว่างการกระทำของมนุษย์ การกระทำจึงเป็นที่ส่งมาจากอุปกรณ์ที่ติดยาเสพติดไปยังเครื่องคอมพิวเตอร์ของผู้ใช้ที่เกิดขึ้นเมื่อพวกเขาเกิดขึ้นและไม่เป็นไปตามที่คาดการณ์นาฬิกา - นั่นคือพวกเขาเกิดขึ้นแบบไม่พร้อมกัน
นึกถึงตอนจบการสัมภาษณ์แล้วผู้ชายก็พูดว่า "อย่าโทรหาเรานะเราจะโทรหาคุณ" นั่นคือสาระสำคัญของเหตุการณ์แบบอะซิงโครนัส
โดยปกติคุณกำหนดฟังก์ชันและคุณเรียกใช้ฟังก์ชันอย่างชัดเจน โปรแกรมของคุณมีโครงสร้างที่เริ่มต้นจากบรรทัดที่ 1 จากนั้นบรรทัดที่ 2 และยกเว้นโค้ดเงื่อนไขและการวนซ้ำฟังก์ชันการโทร ฯลฯ มีโครงสร้างที่เรียบง่ายซับและซิงโครนัส
แต่ในบางกรณีคุณมีการกระทำที่ถูกกระตุ้นโดยเหตุการณ์ที่อยู่นอกเหนือการควบคุมโดยตรงของโปรแกรมสิ่งต่างๆที่มาจากภายนอกโปรแกรมเช่นเหตุการณ์ส่วนติดต่อผู้ใช้ (ผู้ใช้คลิกเมาส์) หรือเหตุการณ์บนเครือข่าย (มีคนพยายามเชื่อมต่อกับ เซิร์ฟเวอร์ของคุณ) รหัสของคุณไม่ได้สร้างเหตุการณ์เหล่านี้โดยตรง พวกเขาสร้างขึ้นนอกโปรแกรมของคุณโดยปกติระบบปฏิบัติการจะขึ้นอยู่กับการตรวจสอบอุปกรณ์อินเทอร์เฟซผู้ใช้และระบบอื่น ๆ สิ่งเหล่านี้เรียกว่าเหตุการณ์แบบอะซิงโครนัส
จำไว้ว่า "อย่าโทรหาเราเราจะโทรหาคุณ"
"ในการเขียนโปรแกรมเหตุการณ์แบบอะซิงโครนัสคือเหตุการณ์ที่เกิดขึ้นโดยไม่ขึ้นกับโฟลว์โปรแกรมหลักการกระทำแบบอะซิงโครนัสคือการดำเนินการในรูปแบบที่ไม่ปิดกั้น
"ด้วย Ajax เว็บแอปพลิเคชันสามารถดึงข้อมูลจากเซิร์ฟเวอร์แบบอะซิงโครนัสในพื้นหลังโดยไม่รบกวนการแสดงผลและลักษณะการทำงานของเพจที่มีอยู่"
เมื่อคุณคลิกแก้ไขและบันทึกใน SO จะเกิดขึ้นแบบอะซิงโครนัส
เหตุการณ์อะซิงโครนัสคือเหตุการณ์ที่รันนอกเธรดหลักของแอ็พพลิเคชัน
วิธีที่ดีที่สุดในการทำความเข้าใจคือการเปรียบเทียบกับเหตุการณ์ที่ทำงานพร้อมกัน ตัวอย่างที่พบบ่อยที่สุดคือการโหลดหน้าเว็บ
เมื่อคุณไปที่หน้านี้คุณคลิกที่ลิงค์และรอให้หน้าเว็บโหลดและไม่สามารถโต้ตอบหรือใช้หน้านี้ได้จนกว่าจะโหลดเสร็จ ในทางตรงกันข้ามหากหน้านี้มีเหตุการณ์ AJAX (นั่นคือเหตุการณ์ Asynchronous JavaScript และ XML) ที่เชื่อมโยงกับการกระทำของผู้ใช้หน้านี้จะโหลดข้อมูลบางส่วนจากแหล่งอื่นแบบอะซิงโครนัสแบบขนาน (ในทางทฤษฎี) พร้อมกับการดำเนินการอื่น ๆ ที่เกิดขึ้น
ตัวอย่างที่มีสองเหตุการณ์ซิงโครนัส (A และ B): First A ทำอะไรบางอย่าง เมื่อ A เสร็จสิ้น B ทำอะไรบางอย่าง
ตัวอย่างที่มีสองเหตุการณ์แบบอะซิงโครนัส (A และ B): ทั้ง A และ B ทำบางสิ่งในเวลาเดียวกันและไม่มีเหตุการณ์ใดรอให้เหตุการณ์อื่นเกิดขึ้น
นี่คือตัวอย่างของการทำงานแบบอะซิงโครนัสในจาวาสคริปต์ (คุณต้องเปิดคอนโซลจาวาสคริปต์ของคุณ)
console.log('One!');
setTimeout(function(){console.log('Two!');},0);
//Doesn't wait
console.log('Three!');};
//OUTPUT:
//One!
//Three!
//Two!
การโทรถึงconsole.log('Two!')
จะดำเนินการโดยไม่มีการปิดกั้นส่วนที่เหลือของรหัสที่เกิดขึ้นหลังจากนั้น
ในสถานการณ์จริงแทนที่ setTimeout ด้วยการคลิกปุ่มบนเว็บเพจ การตอบสนองต่อการคลิกปุ่มจะเกิดขึ้นในที่สุดโดยไม่มีการปิดกั้นการเรียกใช้โค้ดอื่น ๆ เช่นการแสดงผลหน้า
พูดง่ายๆก็คือหมายถึงสิ่งที่เกิดขึ้นหลังจากเวลาที่ไม่รู้จักดังนั้นอย่าคาดหวังผลลัพธ์ในทันที
ตัวอย่างเช่น "แม่ฉันขอเงินห้าเหรียญได้ไหม"
การยื่นมือหาเงินคือฉันคาดหวังให้เธอตอบกลับโดยให้เงินฉัน (ซิงโครนัส) ทันที
ตามความเป็นจริงเธอจะมองมาที่ฉันสักครู่หนึ่งหรือสองครั้งจากนั้นจึงตัดสินใจที่จะตอบสนองเมื่อเธอต้องการ (แบบอะซิงโครนัส)
เมื่อสองเหตุการณ์ที่แตกต่างกันเกิดขึ้นแยกจากกันดังนั้นคุณไม่สามารถทำได้
task1
task2
โดยไม่ตรวจสอบว่าtask1
เสร็จสิ้นจริงๆ
เหตุการณ์แบบอะซิงโครนัสคือเหตุการณ์ที่เราไม่รู้ว่าจะเกิดขึ้นในอนาคตเมื่อใดเช่นเมื่อเซิร์ฟเวอร์ถูกร้องขอสำหรับไฟล์บางไฟล์ที่เราไม่รู้ว่าจะดำเนินการตามคำขอหรือเหตุการณ์ UI ของเราที่เราไม่รู้เมื่อใด คลิกที่ปุ่มหรือองค์ประกอบ UI อื่น ๆ แต่ถึงแม้จะมีสิ่งอื่น ๆ เกิดขึ้นบนหน้าหรือแอปพลิเคชัน แต่ก็ไม่ได้ปิดกั้นสิ่งใดเลยที่กล่าวว่าหน้าเว็บเป็นสีเทา UI ทั้งหมดจนกว่าไฟล์บางไฟล์จากเซิร์ฟเวอร์จะไม่มาหรือมีเหตุการณ์บางอย่างเกิดขึ้นทุกสิ่งไม่เป็นอิสระ นี่คือพลังของเหตุการณ์แบบอะซิงโครนัสพูดง่ายๆว่าเหตุการณ์อิสระ
เทียบกับซิงโครนัส เหตุการณ์แบบอะซิงโครนัส
ตัวจัดการเหตุการณ์บางอย่างจะถูกเรียกทันทีเมื่อเกิดเหตุการณ์ สิ่งเหล่านี้เรียกว่าเหตุการณ์ "ซิงโครนัส" ตัวอย่างคือ DocumentNew ระบบจะเรียกทันทีที่ผู้ใช้สร้างเอกสารใหม่
อย่างไรก็ตามเหตุการณ์บางอย่างจะถูกเรียกหลังจากเหตุการณ์นั้นเกิดขึ้นไม่นานโดยปกติจะเกิดขึ้นหลังจากช่วงเวลาว่างสั้น ๆ สิ่งเหล่านี้เรียกว่าเหตุการณ์ "อะซิงโครนัส" เป็นแบบอะซิงโครนัสเนื่องจากจะทำให้ Source Insight ไม่เสถียรหากมีการเรียกใช้มาโครที่ผู้ใช้เขียนขึ้นในเวลาที่แน่นอนที่เหตุการณ์เกิดขึ้น
หากโค้ดเป็นแบบซิงโครนัส (หรือซิงโครไนซ์ ) หมายความว่าโค้ดแต่ละชิ้นจะทำงานตามลำดับตามลำดับและโค้ดส่วนถัดไปจะไม่สามารถทำงานได้จนกว่าโค้ดก่อนหน้าจะเสร็จสมบูรณ์ โดยทั่วไปโค้ดส่วนใหญ่จะเป็นแบบซิงโครนัส
หากรหัสเป็นแบบอะซิงโครนัส (หรือไม่ตรงกัน ) หมายความว่ารหัสสามารถทำงานแยกกันและเป็นอิสระจากรหัสอื่น ๆ หากมีรหัส async อยู่ตรงกลางของรหัสการซิงค์จำนวนมากภายใต้บริบทของคำถามนี้รหัส async จะทำงานก็ต่อเมื่อมีการทริกเกอร์เหตุการณ์ไม่ว่าคุณจะใส่รหัสการซิงค์ไว้ที่ใด มันแยกออกจากกันอย่างสมบูรณ์และเป็นอิสระจากรหัสการซิงค์และจะทำงานเมื่อใดก็ตามที่มีการบอกเหตุการณ์ไม่ใช่แค่ตอนที่โค้ดก่อนหน้านี้ทำงานเสร็จ ตัวอย่างบางส่วนจะใช้สำหรับโค้ดที่ทำงานในช่วงเวลาที่กำหนดหลังจากบันทึกไฟล์สำเร็จหลังจากส่งคำขอทางเว็บเมื่อผู้ใช้คลิกปุ่มหรือหลังจากโหลดรูปภาพ