The return
tujuannya adalah untuk mengakhiri pelaksanaan fungsi setelah penolakan, dan mencegah eksekusi kode setelah.
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);
});
}
Dalam hal ini mencegah resolve(numerator / denominator);
dari mengeksekusi, yang tidak sepenuhnya diperlukan. Namun, masih lebih baik untuk menghentikan eksekusi untuk mencegah kemungkinan jebakan di masa depan. Selain itu, ini adalah praktik yang baik untuk mencegah menjalankan kode yang tidak perlu.
Latar Belakang
Sebuah janji bisa ada di salah satu dari 3 negara:
- tertunda - keadaan awal. Dari pending kita dapat pindah ke salah satu negara lain
- terpenuhi - operasi yang sukses
- ditolak - operasi gagal
Ketika sebuah janji dipenuhi atau ditolak, itu akan tetap di negara ini tanpa batas waktu (diselesaikan). Jadi, menolak janji yang dipenuhi atau memenuhi janji yang ditolak, tidak akan berpengaruh.
Cuplikan contoh ini menunjukkan bahwa meskipun janji itu dipenuhi setelah ditolak, tetap saja ditolak.
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));
Jadi mengapa kita harus kembali?
Meskipun kami tidak dapat mengubah status janji yang telah ditentukan, menolak atau menyelesaikan tidak akan menghentikan eksekusi seluruh fungsi. Fungsi ini mungkin berisi kode yang akan membuat hasil membingungkan. Sebagai contoh:
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));
Bahkan jika fungsi tidak mengandung kode seperti itu sekarang, ini menciptakan kemungkinan jebakan di masa depan. Refactor di masa depan mungkin mengabaikan fakta bahwa kode tersebut masih dieksekusi setelah janji ditolak, dan akan sulit untuk di-debug.
Menghentikan eksekusi setelah menyelesaikan / menolak:
Ini adalah hal-hal aliran kontrol JS standar.
- Kembali setelah
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));
- Kembali dengan
resolve
/ reject
- karena nilai balik dari callback diabaikan, kita dapat menyimpan garis dengan mengembalikan pernyataan tolak / tekad:
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));
- Menggunakan blok if / else:
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));
Saya lebih suka menggunakan salah satu return
opsi karena kodenya lebih rata.