การสร้าง Promise ที่เสร็จสมบูรณ์แล้วใน JavaScript

บางครั้งคุณอาจต้องการสร้าง Promise ที่เสร็จสิ้นการทำงานแล้ว สำหรับสิ่งนี้มีอยู่ สองวิธี: เมธอด Promise.resolve สร้าง Promise ที่สำเร็จ, Promise.reject สร้าง Promise ถูกปฏิเสธ พารามิเตอร์ของ เมธอดเหล่านี้จะได้รับค่าที่จะเป็นผลลัพธ์ หรือข้อผิดพลาดของ Promise ตามลำดับ

เมื่อไรที่เราอาจต้องการ Promise ที่เสร็จสิ้นแล้ว? ลองดูตัวอย่าง สมมติว่า เรามีฟังก์ชันบางอย่างที่รับพารามิเตอร์ เป็นตัวเลข, ทำบางอย่างกับมันแบบอะซิงโครนัส และส่งคืน Promise พร้อมผลลัพธ์:

javascriptfunction func(num) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(num * num);
    }, 3000);
  });
}

เราจะใช้ฟังก์ชันของเราดังต่อไปนี้ วิธี:

javascriptfunc(5).then(function(res) {
  console.log(res); // จะแสดง 25
});

สมมติว่าตอนนี้เราตัดสินใจว่าการดำเนินการอะซิงโครนัส ของเราเราจะดำเนินการก็ต่อเมื่อ ส่งตัวเลขมากกว่าศูนย์มา มิฉะนั้น ผลลัพธ์ของฟังก์ชันควรเป็นศูนย์:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return 0; // ผลลัพธ์เป็นศูนย์
  }
}

อย่างไรก็ตาม ตอนนี้ปรากฎว่าฟังก์ชันส่งคืน เป็น Promise หรือเป็นตัวเลข ด้วยเหตุนี้เรา ไม่สามารถใช้เมธอด then กับผลลัพธ์ ของฟังก์ชันได้อีกต่อไป เนื่องจากในกรณีที่ฟังก์ชันส่งคืน เป็นตัวเลขเราจะได้ข้อผิดพลาด:

javascriptfunc(0).then(function(res) { // ข้อผิดพลาด, เราใช้เมธอด then กับศูนย์
  
});

Promise.resolve จะช่วยเราแก้ไขปัญหา:

javascriptfunction func(num) {
  if (num > 0) {
    return new Promise(function(resolve) {
      setTimeout(function() {
        resolve(num * num);
      }, 3000);
    });
  } else {
    return Promise.resolve(0); // ส่งคืน Promise, ไม่ใช่ตัวเลข
  }
}

สมมติว่าตอนนี้เราตัดสินใจว่าสำหรับเลขศูนย์ที่ส่งมา เราควรส่งคืนศูนย์ และสำหรับตัวเลข น้อยกว่าศูนย์ - ควรเป็นการยกเว้น วิธีนี้จะช่วยเราได้ ด้วยเมธอด Promise.reject:

javascriptfunction 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 ที่ถูกปฏิเสธ
  }
}