อะไรเป็นตัวกำหนดว่าฟังก์ชั่น Javascript ใดบ้างที่ถูกบล็อกเทียบกับการไม่บล็อก?


27

ฉันได้ทำ Javascript บนเว็บ (วานิลลา JS, jQuery, Backbone ฯลฯ ) มาหลายปีแล้วและเมื่อไม่นานมานี้ฉันได้ทำงานกับ Node.js ฉันใช้เวลาสักครู่เพื่อหยุดการเขียนโปรแกรม "non-blocking" แต่ตอนนี้ฉันคุ้นเคยกับการใช้ callback สำหรับการดำเนินการ IO และอะไรก็ตาม

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

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

บางทีฉันอาจไม่ได้คิดเรื่องนี้อย่างถูกต้อง - หวังว่าจะมีใครบางคนสามารถกำหนดฉันให้ตรงได้ ขอบคุณ!


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

คำตอบ:


13

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

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

ไม่มีวิธีตายตัวที่จะบอกได้อย่างแน่นอน มันจะต้องถูกสะกดออกมาใน doc สำหรับฟังก์ชั่นหรือชัดเจนจากวิธีการทำงานของอินเตอร์เฟซ

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


1
ในฐานะที่เป็นบันทึกเพิ่มเติมฟังก์ชั่น Javascript บางฟังก์ชั่นมีทั้งการบล็อกและการไม่บล็อกขึ้นอยู่กับพารามิเตอร์ ตัวอย่างเช่นXMLHttpRequest.openมีasyncพารามิเตอร์บูลีนซึ่งควบคุมว่าการโทรในภายหลังsendเป็นแบบอะซิงโครนัสหรือไม่
Brian

ฉันไม่พบคำตอบที่เป็นประโยชน์และอธิบายโดยทั่วไป
Mehdi Raash

@MehdiRaash - คำตอบคือคุณเข้าใจจากเอกสารหรือจากส่วนต่อประสาน ไม่มีวิธีอื่น นั่นคือสิ่งที่พูด ไม่แน่ใจว่าคุณคาดหวังอะไรอีก ไม่มีคำตอบ Bullet Magic
jfriend00

6

จากสิ่งที่ฉันเข้าใจว่าคุณไม่ได้ถามเกี่ยวกับสิ่งที่คุณควรทำแบบอะซิงโครนัส แต่จะบอกได้อย่างไรว่าฟังก์ชั่นแบบอะซิงโครนัส

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

นั่นเป็นวิธีเดียวที่เชื่อถือได้อย่างสมบูรณ์

ตอนนี้สำหรับการคาดเดา

  • หากยอมรับการโทรกลับหรือส่งคืนสัญญาอาจเป็นแบบอะซิงโครนัส (ฉันเคยเห็นข้อยกเว้นสำหรับกฎนั้น)
  • โดยทั่วไปทุกอย่างที่เกี่ยวข้องกับ I / O ใน node.js และอื่น ๆ โดยทั่วไปใน JavaScript ก็ทำแบบอะซิงโครนัส (ฉันเคยเห็นข้อยกเว้นของกฎนั้นด้วย)

4

เนื่องจาก JavaScript เป็นเธรดบล็อกการประมวลผลเดียวทั้งหมดจนกว่าจะมีสิ่งใดสิ่งหนึ่งต่อไปนี้เกิดขึ้น

1) การดำเนินการปัจจุบันร้องขอบริการภายนอกเช่นคำขอ I / O หรือคำขอเครือข่ายหรือคำขอเว็บเวิร์ค

2) การเรียกฟังก์ชั่นจะถูกวางไว้บนตัวจับเวลาที่จะดำเนินการในภายหลัง

ไม่มีรายการฟังก์ชันปิดกั้น / ไม่ปิดกั้น คุณควรตรวจสอบเอกสาร

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

โดยทั่วไปสมมติว่าโค้ดบล็อกนั้นไม่มีการเรียกกลับ และแม้ว่าจะมีการติดต่อกลับนั่นไม่ได้หมายความว่ามันจะไม่บล็อก


-1

ฉันยังใหม่กับ node.js (และ JavaScript โดยทั่วไป) และฉันไม่คุ้นเคยกับโค้ดอะซิงโครนัสมากนัก ฉันแค่อยากจะชี้ให้เห็นว่าในภาพรวมของการบล็อก vs การไม่บล็อกบนnodejs.orgมันระบุว่า:

เมธอด I / O ทั้งหมดในไลบรารีมาตรฐาน Node.js จัดเตรียมเวอร์ชันอะซิงโครนัสซึ่งไม่ใช่การปิดกั้นและรับฟังก์ชั่นการโทรกลับ วิธีการบางอย่างมีการบล็อกคู่หูซึ่งมีชื่อที่ลงท้ายด้วย Sync


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