ความแตกต่างคืออะไร?
การ.then()โทรจะคืนสัญญาที่จะถูกปฏิเสธในกรณีที่การโทรกลับโยนข้อผิดพลาด ซึ่งหมายความว่าเมื่อคุณประสบความสำเร็จloggerล้มเหลวผิดพลาดจะถูกส่งผ่านไปดังต่อไปนี้.catch()การเรียกกลับ แต่ไม่ให้โทรกลับที่จะไปข้างด้วยfailsuccess
นี่คือแผนภาพการควบคุมการไหล :

ในการแสดงมันในรหัสซิงโครนัส:
// some_promise_call().then(logger.log, logger.log)
then: {
    try {
        var results = some_call();
    } catch(e) {
        logger.log(e);
        break then;
    } // else
        logger.log(results);
}
ที่สองlog(ซึ่งเป็นเหมือนอาร์กิวเมนต์แรก.then()) จะถูกดำเนินการเฉพาะในกรณีที่ไม่มีข้อยกเว้นเกิดขึ้น บล็อกที่มีป้ายกำกับและbreakคำสั่งรู้สึกแปลก ๆ นี่เป็นสิ่งที่หลามมีtry-except-elseให้ (แนะนำให้อ่าน!)
// some_promise_call().then(logger.log).catch(logger.log)
try {
    var results = some_call();
    logger.log(results);
} catch(e) {
    logger.log(e);
}
ตัวcatchบันทึกจะจัดการข้อยกเว้นจากการเรียกตัวบันทึกสำเร็จด้วย
มากสำหรับความแตกต่าง
  ฉันไม่ค่อยเข้าใจคำอธิบายสำหรับลองและจับ
อาร์กิวเมนต์คือโดยปกติแล้วคุณต้องการตรวจจับข้อผิดพลาดในทุกขั้นตอนของการประมวลผลและคุณไม่ควรใช้มันในกลุ่ม ความคาดหวังคือคุณมีตัวจัดการขั้นสุดท้ายเพียงหนึ่งตัวเท่านั้นที่จัดการข้อผิดพลาดทั้งหมด - ในขณะที่เมื่อคุณใช้ "antipattern" ข้อผิดพลาดในการเรียกกลับบางส่วนนั้นจะไม่ได้รับการจัดการ
อย่างไรก็ตามรูปแบบนี้มีประโยชน์มากจริง ๆ : เมื่อคุณต้องการจัดการข้อผิดพลาดที่เกิดขึ้นในขั้นตอนนี้และคุณต้องการทำสิ่งที่แตกต่างอย่างสิ้นเชิงเมื่อไม่มีข้อผิดพลาดเกิดขึ้น - เช่นเมื่อข้อผิดพลาดไม่สามารถกู้คืนได้ โปรดทราบว่านี่เป็นการแยกการควบคุมของคุณออก แน่นอนว่าบางครั้งเป็นที่ต้องการ
  เกิดอะไรขึ้นกับสิ่งต่อไปนี้
some_promise_call()
.then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
ว่าคุณต้องโทรกลับซ้ำ คุณค่อนข้างต้องการ
some_promise_call()
   .catch(function(e) {
       return e; // it's OK, we'll just log it
   })
   .done(function(res) {
       logger.log(res);
   });
คุณอาจพิจารณาใช้.finally()สำหรับสิ่งนี้
               
              
then().catch()สามารถอ่านได้มากขึ้นเนื่องจากคุณไม่จำเป็นต้องค้นหาเครื่องหมายจุลภาคและตรวจสอบว่าการติดต่อกลับนี้เพื่อความสำเร็จหรือสาขาที่ล้มเหลว