ข้อผิดพลาดหรือข้อผิดพลาดที่แตกต่างกันเป็นอาร์กิวเมนต์แรกหรือไม่


12

เรา (และห้องสนทนา JS SO) ได้พูดคุยกับ @rlemon เมื่อหลายวันก่อนเกี่ยวกับห้องสมุดLittle-XHRของเขาเกี่ยวกับการจัดการข้อผิดพลาด

โดยทั่วไปเราต้องการตัดสินใจว่าควรใช้รูปแบบการจัดการข้อผิดพลาดใด:

xhr.get({
    // Some parameters, and then
    success: function(data) {},
    failure: function(data) {}
})

หรือ:

xhr.get({
    // Some parameters, and then
    callback: function(err, data) {}
})

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

ความเห็น / ข้อได้เปรียบ / ข้อเสียเปรียบเกี่ยวกับทั้งสองรูปแบบเหล่านี้หรือไม่


xhr.get({ ... }, function (err, data) {})อย่างน้อยได้รับรูปแบบที่ถูกต้อง
Raynos

คำตอบ:


5

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

โดยส่วนตัวแล้วฉันชอบ

(err, data)เพราะมันเป็นวิธีมาตรฐานในการจัดการกับสิ่งต่าง ๆ มันช่วยให้การจัดองค์ประกอบฟังก์ชั่น

ตัวอย่างเช่นafter.mapใช้รูปแบบนี้ ดังนั้นรหัสชอบ

after.map(["foo.js", "bar.js"], function (fileName, callback) {
    fs.readFile(fileName, function (err, file) {
        callback(err, file)
    })
}, function (err, files) {
    // handle files
})

สามารถทำให้ง่ายขึ้น

after.map(["foo.js", "bar.js", fs.readFile, function (err, files) {
    // handle files
})

ข้อดีอีกอย่างคือคุณสามารถส่งผ่านการติดต่อกลับเป็นพารามิเตอร์สุดท้ายได้

asyncOperation(options, function (err, data) {
    // not nested inside an object literal
})

วิธีสุดท้ายในการติดต่อกลับเป็นวิธีคุ้นเคยกับ API ที่ดี

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

เมื่อคุณใช้(err, data)มันจะเตือนให้คุณคิดเกี่ยวกับวิธีจัดการกับข้อผิดพลาดนี้ได้อย่างมีประสิทธิภาพทุกครั้ง


2

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

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

ทางเลือกโดยใช้วิธีการเดียวจะใช้เวลาอ่านนานกว่าเมื่อคุณแก้ไขโค้ดนั้น นอกจากนี้คุณอาจจะได้อะไรแบบนี้

xhr.get({
    callback: function(err, data) {
        if (err) {
            // handle that error somehow
        }
        else {
            // deal with success somehow
        }
    }
})

และแผ่นหม้อน้ำชนิดนั้นก็น่าเบื่อเร็ว

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


มันยากที่จะเห็นการโทรกลับข้อผิดพลาดที่ขาดหายไปและง่ายกว่าที่จะเห็นว่าคุณไม่ได้จัดการกับerrพารามิเตอร์ตัวแรก
Raynos

2

แยกการโทรกลับ

หากการxhr.get()โทรสำเร็จerrจะมีการซ้ำซ้อน หากการโทรล้มเหลว dataซ้ำซ้อน แทนที่จะบังคับให้รหัสลูกค้าตรวจสอบสถานะของสิ่งใดสิ่งหนึ่งไม่ผ่านทั้งคู่

หากปรากฎว่าความสำเร็จนั้นอาจหมายถึงความสำเร็จเพียงบางส่วนระบุว่าแยกจากกัน ความล้มเหลวมักจะเป็นตัวเลือกการประกันตัวออก

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

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