การโทรกลับที่มีอยู่ทุกหนทุกแห่งใน JavaScript เป็นหายนะสำหรับการควบคุมกระบวนการและข้อเสียของพวกเขาชัดเจน:
1. หากไม่มีผลตอบแทนที่ชัดเจนมันเป็นเรื่องง่ายที่จะสร้างกระบวนการและข้อบกพร่องที่ไม่จำเป็นที่เกิดจากพวกเขา
2. รหัสซ้อนกันอย่างไม่มีที่สิ้นสุดและอ่านยาก
มาพูดคุยเกี่ยวกับวิธีการแก้ปัญหาและหลีกเลี่ยงปัญหาข้างต้น
ปัญหาแรกคือปัญหานิสัย เมื่อใช้การโทรกลับผู้คนมักลืมใช้ผลตอบแทน สถานการณ์นี้เป็นจริงโดยเฉพาะอย่างยิ่งเมื่อใช้ Coffee-Script (แม้ว่ามันจะรวบรวมข้อมูลสุดท้ายเป็นค่าส่งคืนเมื่อรวบรวมลงใน JavaScript ค่าคืนนี้ไม่จำเป็นต้องเป็นตัวแทนของความตั้งใจดั้งเดิมของคุณ) ดูตัวอย่างด้านล่าง
การคัดลอกรหัสมีดังนี้:
a = (err, callback)->
การโทรกลับ () ถ้าทำผิด?
console.log 'คุณจะเห็นฉัน'
b = ->
console.log 'ฉันเป็นคนโทรกลับ'
A ('ข้อผิดพลาด', b)
ในรูปแบบรหัส "ข้อผิดพลาดครั้งแรก" ที่เรียกว่านี้เห็นได้ชัดว่าเราไม่ต้องการรหัสที่ตามมาในวิธี A ที่จะดำเนินการเมื่อเกิดข้อผิดพลาด แต่เราไม่ต้องการใช้การโยนเพื่อทำให้กระบวนการทั้งหมดวางสาย (คุณต้องตายอย่างสง่างาม ~) ดังนั้นรหัสข้างต้นจะทำให้เกิดข้อบกพร่อง
ทางออกหนึ่งคือการเขียนอย่างตรงไปตรงมาถ้า ... อื่น ... แต่ฉันชอบสิ่งต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
a = (err, callback)->
ส่งคืนการโทรกลับ () ถ้าเอ่อ?
console.log 'คุณจะไม่เห็นฉัน'
b = ->
console.log 'ฉันเป็นคนโทรกลับ'
A ('ข้อผิดพลาด', b)
ค่าการส่งคืนส่วนใหญ่ในวิธีการแบบอะซิงโครนัส JavaScript นั้นไร้ประโยชน์ดังนั้นที่นี่เราใช้ Return เป็นบทบาทควบคุมกระบวนการโดยมีรหัสน้อยกว่าถ้า ... อื่น ... แต่ชัดเจนกว่า
ปัญหาที่สองคือมันยากที่จะกำจัด
วิธีที่ดีคือการใช้โมดูลควบคุมกระบวนการบางอย่างเพื่อให้รหัสดูเป็นระเบียบมากขึ้น ตัวอย่างเช่น Async เป็นโมดูลที่ดีที่ให้ชุดของอินเทอร์เฟซรวมถึงการวนซ้ำลูปและข้อความที่มีเงื่อนไขบางอย่างและแม้แต่ระบบคิว ตัวอย่างต่อไปนี้สามารถใช้เพื่ออธิบายข้อดีและข้อเสียของสองวิธีในการเขียนชื่อ
การคัดลอกรหัสมีดังนี้:
#ปกติ
ก่อน = (โทรกลับ)->
console.log 'ฉันเป็นฟังก์ชันแรก'
การโทรกลับ ()
second = (โทรกลับ)->
console.log 'ฉันเป็นฟังก์ชันที่สอง'
การโทรกลับ ()
สาม = ()->
console.log 'ฉันเป็นคนที่สาม'
ก่อน ->
วินาที ->
ที่สาม()
# ใช้ async
async = ต้องการ ('async')
async.waterfall [
อันดับแรก,
ที่สอง,
ที่สาม
], (err)->
ในฐานะคนฉลาดคุณจะเลือกอันไหน?