return
วัตถุประสงค์คือการยุติการดำเนินการของการทำงานหลังจากที่ปฏิเสธและป้องกันไม่ให้การดำเนินการของรหัสหลังจากที่มัน
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
return; // The function execution ends here
}
resolve(numerator / denominator);
});
}
ในกรณีนี้จะป้องกันไม่ให้การresolve(numerator / denominator);
ดำเนินการซึ่งไม่จำเป็นอย่างเคร่งครัด อย่างไรก็ตามยังคงดีกว่าที่จะยุติการดำเนินการเพื่อป้องกันกับดักที่เป็นไปได้ในอนาคต นอกจากนี้เป็นแนวปฏิบัติที่ดีในการป้องกันการเรียกใช้รหัสโดยไม่จำเป็น
พื้นหลัง
สัญญาสามารถอยู่ในหนึ่งใน 3 สถานะ:
- รอดำเนินการ - สถานะเริ่มต้น จากการรอดำเนินการเราสามารถย้ายไปยังสถานะอื่น
- ปฏิบัติ - สำเร็จ
- ปฏิเสธ - การดำเนินการล้มเหลว
เมื่อสัญญาเป็นจริงหรือปฏิเสธสัญญานั้นจะคงอยู่ในสถานะนี้ (ตัดสิน) ดังนั้นการปฏิเสธสัญญาที่ได้รับการเติมเต็มหรือการทำตามสัญญาที่ถูกปฏิเสธจะไม่มีผล
ตัวอย่างตัวอย่างนี้แสดงให้เห็นว่าแม้ว่าคำสัญญาจะได้รับการเติมเต็มหลังจากถูกปฏิเสธ แต่ก็ยังคงถูกปฏิเสธ
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
}
resolve(numerator / denominator);
});
}
divide(5,0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
แล้วทำไมเราต้องส่งคืน
แม้ว่าเราจะไม่สามารถเปลี่ยนสถานะสัญญาที่ชำระแล้วการปฏิเสธหรือการแก้ไขจะไม่หยุดการดำเนินการของฟังก์ชันที่เหลือ ฟังก์ชั่นอาจมีรหัสที่จะสร้างผลลัพธ์ที่สับสน ตัวอย่างเช่น:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
แม้ว่าฟังก์ชั่นจะไม่มีรหัสดังกล่าวในตอนนี้สิ่งนี้จะสร้างกับดักในอนาคตที่เป็นไปได้ ผู้ปรับโครงสร้างในอนาคตอาจเพิกเฉยต่อความจริงที่ว่ารหัสยังคงดำเนินการหลังจากที่สัญญาถูกปฏิเสธและจะยากที่จะแก้ปัญหา
การหยุดการประมวลผลหลังจากการแก้ไข / ปฏิเสธ:
นี่คือสิ่งที่โฟลว์คอนโทรล JS มาตรฐาน
- ย้อนกลับหลัง
resolve
/ reject
:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
return;
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
- Return with the
resolve
/ reject
- เนื่องจากค่าที่ส่งคืนของการเรียกกลับถูกเพิกเฉยเราสามารถบันทึกบรรทัดได้โดยส่งคืนคำสั่งปฏิเสธ / แก้ไข:
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
return reject("Cannot divide by 0");
}
console.log('operation succeeded');
resolve(numerator / denominator);
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
function divide(numerator, denominator) {
return new Promise((resolve, reject) => {
if (denominator === 0) {
reject("Cannot divide by 0");
} else {
console.log('operation succeeded');
resolve(numerator / denominator);
}
});
}
divide(5, 0)
.then((result) => console.log('result: ', result))
.catch((error) => console.log('error: ', error));
ฉันชอบที่จะใช้หนึ่งในreturn
ตัวเลือกที่เป็นรหัสประจบ