Các return
mục đích là để chấm dứt việc thực hiện các chức năng sau khi bị từ chối, và ngăn chặn việc thực hiện các mã sau nó.
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);
});
}
Trong trường hợp này, nó ngăn chặn việc resolve(numerator / denominator);
thực thi, không thực sự cần thiết. Tuy nhiên, vẫn nên chấm dứt việc thực hiện để ngăn chặn một cái bẫy có thể xảy ra trong tương lai. Ngoài ra, đó là một cách thực hành tốt để ngăn chặn việc chạy mã không cần thiết.
Lý lịch
Một lời hứa có thể ở một trong 3 trạng thái:
- đang chờ xử lý - trạng thái ban đầu. Từ chờ xử lý, chúng tôi có thể chuyển sang một trong những tiểu bang khác
- hoàn thành - hoạt động thành công
- bị từ chối - hoạt động thất bại
Khi một lời hứa được thực hiện hoặc từ chối, nó sẽ ở trong trạng thái này vô thời hạn (giải quyết). Vì vậy, từ chối một lời hứa đã thực hiện hoặc thực hiện một lời hứa bị từ chối, sẽ không có hiệu lực.
Đoạn ví dụ này cho thấy rằng mặc dù lời hứa đã được thực hiện sau khi bị từ chối, nó vẫn bị từ chối.
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));
Vậy tại sao chúng ta cần quay trở lại?
Mặc dù chúng ta không thể thay đổi trạng thái lời hứa đã được giải quyết, việc từ chối hoặc giải quyết sẽ không dừng việc thực thi phần còn lại của chức năng. Hàm này có thể chứa mã sẽ tạo ra kết quả khó hiểu. Ví dụ:
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));
Ngay cả khi hàm không chứa mã như vậy ngay bây giờ, điều này sẽ tạo ra một cái bẫy trong tương lai. Một bộ tái cấu trúc trong tương lai có thể bỏ qua thực tế là mã vẫn được thực thi sau khi lời hứa bị từ chối và sẽ khó gỡ lỗi.
Dừng thực thi sau khi giải quyết / từ chối:
Đây là công cụ lưu lượng kiểm soát JS tiêu chuẩn.
- Quay trở lại sau
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));
- Trả về với
resolve
/ reject
- vì giá trị trả về của cuộc gọi lại bị bỏ qua, chúng tôi có thể lưu một dòng bằng cách trả về câu lệnh từ chối / giải quyết:
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));
Tôi thích sử dụng một trong các return
tùy chọn vì mã là phẳng hơn.