คำจำกัดความของ "เหตุการณ์อะซิงโครนัส" ที่เข้าใจง่าย? [ปิด]


88

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

ขอบคุณ!

คำตอบ:


422

ตัวอย่างที่ไม่ใช่การเขียนโปรแกรม:

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

ไม่ตรงกัน คุณต้องการพิซซ่าเป็นอาหารค่ำในขณะที่เล่น WOW คุณเปิดหน้าต่างเบราว์เซอร์บนจอภาพที่ 5 ของคุณ คุณโหลดเว็บไซต์ Pizza และสั่งพิซซ่าเบคอนแสนอร่อยพร้อมซอสกระเทียมเบคอน คุณกลับไปที่การจู่โจมของคุณและหลังจากผ่านไป 20 นาทีกริ่งประตูก็ดังขึ้น คุณได้รับพิซซ่า คุณนั่งลงหน้าคอมพิวเตอร์กินพิซซ่าและดำเนินการจู่โจมต่อ

แล้วอะไรคือความแตกต่าง? วิธีหนึ่งที่คุณเสียเวลาไปกับการว้าวอันมีค่า 20-30 นาทีและอีกวิธีหนึ่งที่คุณเสียไป $ 20 บวกทิป


53
ฉันรู้สึกเศร้าที่ฉันคิดว่ามันตลกมาก
Denis Hoctor

3
ฉันต้องยอมรับว่านี่อาจเป็นคำอธิบายที่ไม่ใช่การเขียนโปรแกรมที่ดีที่สุดที่ฉันเคยเห็นมานานแล้ว! ตัวอย่างที่ดี!
Iban Dominguez Noda

ฉันเข้าใจแล้วและคำตอบนี้ช่วยให้ฉันเข้าใจ แต่ฉันต้องการพิซซ่าตอนนี้ = / และคำขอจะไม่ดำเนินต่อไปจนกว่าฉันจะได้รับพิซซ่า -_-
Maduro

ฉันชอบ "ตัวอย่างการเขียนโปรแกรมที่ไม่ใช่" !!
Cynthia Sanchez

@epascarello ด้านตลกมันใช้งานได้ดีจริงๆ !!! ไม่ต้องพูดถึงก็เข้าใจชัดเจน ฉันต้องการขอความช่วยเหลือจากคุณสำหรับโครงการ
Omar

19

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

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

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


3
+1 เรื่องดี :) เชิญมาก ... มันทำให้ฉันเลื่อนเมาส์แล้วคลิกลูกศร "โหวตขึ้น" และนี่คือเหตุการณ์แบบอะซิงโครนัสอีกครั้ง ....
Felix Kling

1
ตัวอย่างที่ดีการเลือกกิจกรรมของเบราว์เซอร์นั้นยอดเยี่ยมมาก!
sjsam

18

นึกถึงตอนจบการสัมภาษณ์แล้วผู้ชายก็พูดว่า "อย่าโทรหาเรานะเราจะโทรหาคุณ" นั่นคือสาระสำคัญของเหตุการณ์แบบอะซิงโครนัส

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

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

จำไว้ว่า "อย่าโทรหาเราเราจะโทรหาคุณ"


12

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

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

เมื่อคุณคลิกแก้ไขและบันทึกใน SO จะเกิดขึ้นแบบอะซิงโครนัส


12

เหตุการณ์อะซิงโครนัสคือเหตุการณ์ที่รันนอกเธรดหลักของแอ็พพลิเคชัน

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

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

ตัวอย่างที่มีสองเหตุการณ์ซิงโครนัส (A และ B): First A ทำอะไรบางอย่าง เมื่อ A เสร็จสิ้น B ทำอะไรบางอย่าง

ตัวอย่างที่มีสองเหตุการณ์แบบอะซิงโครนัส (A และ B): ทั้ง A และ B ทำบางสิ่งในเวลาเดียวกันและไม่มีเหตุการณ์ใดรอให้เหตุการณ์อื่นเกิดขึ้น


7

นี่คือตัวอย่างของการทำงานแบบอะซิงโครนัสในจาวาสคริปต์ (คุณต้องเปิดคอนโซลจาวาสคริปต์ของคุณ)

console.log('One!');
setTimeout(function(){console.log('Two!');},0);
//Doesn't wait
console.log('Three!');};

//OUTPUT:
//One!
//Three!
//Two!

การโทรถึงconsole.log('Two!')จะดำเนินการโดยไม่มีการปิดกั้นส่วนที่เหลือของรหัสที่เกิดขึ้นหลังจากนั้น

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


5

พูดง่ายๆก็คือหมายถึงสิ่งที่เกิดขึ้นหลังจากเวลาที่ไม่รู้จักดังนั้นอย่าคาดหวังผลลัพธ์ในทันที

ตัวอย่างเช่น "แม่ฉันขอเงินห้าเหรียญได้ไหม"

การยื่นมือหาเงินคือฉันคาดหวังให้เธอตอบกลับโดยให้เงินฉัน (ซิงโครนัส) ทันที

ตามความเป็นจริงเธอจะมองมาที่ฉันสักครู่หนึ่งหรือสองครั้งจากนั้นจึงตัดสินใจที่จะตอบสนองเมื่อเธอต้องการ (แบบอะซิงโครนัส)


2

เมื่อสองเหตุการณ์ที่แตกต่างกันเกิดขึ้นแยกจากกันดังนั้นคุณไม่สามารถทำได้

task1
task2

โดยไม่ตรวจสอบว่าtask1เสร็จสิ้นจริงๆ


1

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


0

เทียบกับซิงโครนัส เหตุการณ์แบบอะซิงโครนัส

ตัวจัดการเหตุการณ์บางอย่างจะถูกเรียกทันทีเมื่อเกิดเหตุการณ์ สิ่งเหล่านี้เรียกว่าเหตุการณ์ "ซิงโครนัส" ตัวอย่างคือ DocumentNew ระบบจะเรียกทันทีที่ผู้ใช้สร้างเอกสารใหม่

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


0

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

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

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