รหัส Javascript เป็นแบบอะซิงโครนัสอย่างไรเมื่อใช้การเรียกกลับ


26

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


2
คุณอาจสนใจที่จะอ่านวิธีที่เบราว์เซอร์ประสบความสำเร็จในการอ่านหัวข้อเดียวเขียนโดย John Resig: ejohn.org/blog/how-javascript-timers-work
Jalayn

@Jalayn ขอบคุณ ความคิดเห็นของคุณสร้างความแตกต่างทั้งหมดหลังจากอ่านคำตอบหลายข้อ
kushalvm

คำตอบ:


26

มันไม่ได้ เพียงแค่ทำการโทรกลับหรือผ่านการติดต่อกลับไม่ได้หมายความว่าเป็นการซิงโครนัส

ตัวอย่างเช่น.forEachฟังก์ชั่นใช้โทรกลับ แต่จะซิงโคร

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

setTimeoutใช้เวลาโทรกลับเกินไปและไม่ตรงกัน

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

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


2
@ SteveEvers ฉันเดาว่าคุณสามารถแก้ไขบทความ MDNได้ การโทรกลับเป็นคำทั่วไปในจาวาสคริปต์สำหรับฟังก์ชั่นใด ๆ ที่ส่งผ่านไปยังอีกที่โทรกลับคุณโดยใช้ฟังก์ชั่นที่คุณให้ ... ทำไมมันซับซ้อน? แก้ไข: โทรกลับยังใช้ในรายละเอียด
Esailija

3
@SteveEvers "callback implies asyncrony" เป็น C # / Microsoft idiosyncrasy en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija

1
@ MikeBrown ฉันคิดว่าฉันอ่านมากเกินไปในโปรไฟล์ของเขาและนี่ - คำตอบที่ upvoted ที่สุดแน่นอนให้ความคิดที่ว่า "การเรียกกลับหมายถึงแบบอะซิงโครนัส"
Esailija

1
แต่การถูกกล่าวถึง @SteveEvers ก็ผิดเช่นกัน การโทรกลับไม่ได้หมายถึงอะซิงโครนัสเพียงแค่มีคนอื่นจะรับผิดชอบในการ "โทรกลับ"
Michael Brown

1
+1 เพราะสตีฟ Evers เป็นสิ่งที่ผิด
slebetman

23

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

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


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