Membuat Promise yang Telah Selesai di JavaScript
Terkadang Anda mungkin perlu membuat promise
yang telah selesai. Untuk ini, terdapat
dua metode: metode Promise.resolve
menciptakan promise yang berhasil diselesaikan, Promise.reject
menciptakan promise yang ditolak. Sebagai parameternya,
metode-metode ini menerima apa yang akan menjadi hasil
atau kesalahan promise secara berurutan.
Kapan kita mungkin membutuhkan promise yang telah selesai? Mari kita lihat sebuah contoh. Misalkan kita memiliki suatu fungsi yang parameternya menerima sebuah angka, melakukan sesuatu secara asinkron dan mengembalikan promise dengan hasilnya:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Kita akan menggunakan fungsi kita dengan cara berikut:
func(5).then(function(res) {
console.log(res); // akan menampilkan 25
});
Misalkan sekarang kita memutuskan bahwa operasi asinkron kita akan dilakukan hanya jika angka yang diberikan lebih besar dari nol. Jika tidak, hasil fungsi haruslah nol:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // hasil nol
}
}
Namun, sekarang yang terjadi adalah fungsi mengembalikan
baik promise maupun angka. Karena ini, kita tidak bisa
lagi menerapkan metode then pada hasil
fungsi, karena dalam kasus fungsi mengembalikan
angka kita akan mendapatkan kesalahan:
func(0).then(function(res) { // error, menerapkan metode then pada nol
});
Memperbaiki masalah ini akan dibantu oleh Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // mengembalikan promise, bukan angka
}
}
Misalkan sekarang kita memutuskan bahwa untuk angka nol
yang diberikan kita harus mengembalikan nol, dan untuk angka
kurang dari nol - sebuah pengecualian. Dalam hal ini kita akan dibantu oleh
metode Promise.reject:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else if (num === 0) {
return Promise.resolve(0);
} else {
return Promise.reject('incorrect number'); // mengembalikan promise yang ditolak
}
}