การสร้าง Promise ที่เสร็จสมบูรณ์แล้วใน JavaScript
บางครั้งคุณอาจต้องการสร้าง Promise ที่เสร็จสิ้นการทำงานแล้ว
สำหรับสิ่งนี้มีอยู่
สองวิธี: เมธอด Promise.resolve
สร้าง Promise ที่สำเร็จ, Promise.reject
สร้าง Promise ถูกปฏิเสธ พารามิเตอร์ของ
เมธอดเหล่านี้จะได้รับค่าที่จะเป็นผลลัพธ์
หรือข้อผิดพลาดของ Promise ตามลำดับ
เมื่อไรที่เราอาจต้องการ Promise ที่เสร็จสิ้นแล้ว? ลองดูตัวอย่าง สมมติว่า เรามีฟังก์ชันบางอย่างที่รับพารามิเตอร์ เป็นตัวเลข, ทำบางอย่างกับมันแบบอะซิงโครนัส และส่งคืน Promise พร้อมผลลัพธ์:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
เราจะใช้ฟังก์ชันของเราดังต่อไปนี้ วิธี:
func(5).then(function(res) {
console.log(res); // จะแสดง 25
});
สมมติว่าตอนนี้เราตัดสินใจว่าการดำเนินการอะซิงโครนัส ของเราเราจะดำเนินการก็ต่อเมื่อ ส่งตัวเลขมากกว่าศูนย์มา มิฉะนั้น ผลลัพธ์ของฟังก์ชันควรเป็นศูนย์:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // ผลลัพธ์เป็นศูนย์
}
}
อย่างไรก็ตาม ตอนนี้ปรากฎว่าฟังก์ชันส่งคืน
เป็น Promise หรือเป็นตัวเลข ด้วยเหตุนี้เรา
ไม่สามารถใช้เมธอด then กับผลลัพธ์
ของฟังก์ชันได้อีกต่อไป เนื่องจากในกรณีที่ฟังก์ชันส่งคืน
เป็นตัวเลขเราจะได้ข้อผิดพลาด:
func(0).then(function(res) { // ข้อผิดพลาด, เราใช้เมธอด then กับศูนย์
});
Promise.resolve จะช่วยเราแก้ไขปัญหา:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // ส่งคืน Promise, ไม่ใช่ตัวเลข
}
}
สมมติว่าตอนนี้เราตัดสินใจว่าสำหรับเลขศูนย์ที่ส่งมา
เราควรส่งคืนศูนย์ และสำหรับตัวเลข
น้อยกว่าศูนย์ - ควรเป็นการยกเว้น วิธีนี้จะช่วยเราได้
ด้วยเมธอด 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'); // ส่งคืน Promise ที่ถูกปฏิเสธ
}
}