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