Pengecualian dalam Rantai Promise di JavaScript
Misalkan karena alasan tertentu promise kita berakhir dengan kesalahan:
let promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject('error');
}, 3000);
});
Dalam hal ini, eksekusi kode akan langsung beralih
ke then yang memiliki fungsi penangan
kesalahan, atau ke catch pertama, tergantung
mana yang ditemukan lebih dulu.
Berikut adalah contoh situasi pertama:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
},
function(error) {
// eksekusi akan langsung beralih ke sini
}
).then(
function(result) {
console.log(result);
}
);
Berikut adalah contoh situasi kedua:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// eksekusi akan langsung beralih ke sini
}
).then(
function(result) {
console.log(result);
}
);
Fungsi penangan memiliki dua opsi tindakan:
jika ia berhasil menangani situasi pengecualian,
maka ia dapat mengembalikan hasil melalui return
dan eksekusi akan dilanjutkan ke rantai berikutnya.
Jika ia tidak berhasil menangani kesalahan, maka ia dapat
baik tidak mengembalikan apa pun, atau melemparkan pengecualian
melalui throw. Dalam hal ini, eksekusi
akan beralih ke penangkap kesalahan berikutnya
(di then atau catch - mana yang ditemukan
lebih dulu).
Biasanya, semua kesalahan dalam rantai ditangkap
di satu tempat: sebuah catch ditempatkan
di akhir rantai:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
// kita akan sampai di sini jika terjadi kesalahan
}
);
Pengecualian dapat muncul di dalam promise itu sendiri,
atau dilempar melalui throw
di setiap bagian rantai:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
if (semuaBaik) {
return result + '2';
} else {
throw new Error('kesalahan'); // beralih ke penangkap terdekat
}
}
)
.then(
function(result) {
return result + '3';
}
).catch(
function(error) {
// penangkap terdekat
}
);
Perlu diingat bahwa catch diperlukan tepat untuk
mendiagnosis kesalahan: apakah dapat diatasi atau tidak.
Jika kesalahan dapat diatasi, maka catch harus
meneruskan solusinya ke then berikutnya.
Dan jika tidak dapat diatasi (atau catch ini
sekadar tidak tahu cara mengatasinya), maka kita harus
tidak mengembalikan apa-apa atau melemparkan pengecualian:
promise.then(
function(result) {
return result + '1';
}
).then(
function(result) {
return result + '2';
}
).catch(
function(error) {
if (kesalahanDapatDiatasi) {
return 'data'; // kirim ke then berikutnya
} else {
// tidak mengembalikan apa-apa atau melemparkan pengecualian
}
}
).then(
function(result) {
// di sini kita mengatasi kesalahan
}
);