Mencipta Janji yang Telah Selesai dalam JavaScript
Kadangkala anda mungkin perlu mencipta janji
yang telah selesai. Untuk ini terdapat
dua kaedah: kaedah Promise.resolve
mencipta janji yang berjaya diselesaikan, Promise.reject
mencipta janji yang ditolak. Parameter yang diterima oleh
kaedah-kaedah ini adalah apa yang akan menjadi hasil
atau ralat janji masing-masing.
Bilakah kita mungkin memerlukan janji yang telah selesai? Mari kita lihat contoh. Katakan kita mempunyai beberapa fungsi yang menerima parameter nombor, melakukan sesuatu secara tak segerak dengannya dan mengembalikan janji dengan hasil:
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 memaparkan 25
});
Katakan sekarang kita memutuskan bahawa operasi tak segerak kita hanya akan dilakukan jika nombor yang diberikan lebih besar daripada sifar. Jika tidak, hasil fungsi mestilah sifar:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // hasil sifar
}
}
Walau bagaimanapun, sekarang ini bermakna fungsi mengembalikan
sama ada janji atau nombor. Oleh kerana itu, kita tidak lagi
boleh menggunakan kaedah then pada hasil
fungsi, kerana dalam kes fungsi mengembalikan
nombor kita akan mendapat ralat:
func(0).then(function(res) { // ralat, menggunakan kaedah then pada sifar
});
Masalah ini boleh dibetulkan dengan 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 janji, bukan nombor
}
}
Katakan sekarang kita memutuskan bahawa untuk nombor sifar
yang diberikan kita harus mengembalikan sifar, dan untuk nombor
kurang daripada sifar - pengecualian. Untuk ini, kaedah
Promise.reject akan membantu kita:
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 janji yang ditolak
}
}