การใช้งาน async/await และ setTimeout ใน JavaScript
ในโลกของการพัฒนา JavaScript การจัดการกับงานที่ทำงานแบบไม่พร้อมกัน (asynchronous tasks) เป็นสิ่งที่ท้าทายและจำเป็น async/await
และ setTimeout
เป็นสองเครื่องมือที่ใช้ในการจัดการกับการทำงานแบบไม่พร้อมกันที่มีการใช้งานอย่างแพร่หลาย แม้ว่าทั้งสองจะมีวัตถุประสงค์และการใช้งานที่แตกต่างกัน แต่ก็มีบางประเด็นที่สามารถนำมาเปรียบเทียบกันได้ ในบทความนี้เราจะมาดูว่า async/await
และ setTimeout
มีความเหมือนและความแตกต่างกันอย่างไร และในกรณีใดบ้างที่เหมาะสมกับการใช้งานแต่ละวิธี
async/await
async/await
เป็นฟีเจอร์ใน JavaScript ที่ช่วยให้เราจัดการกับการทำงานแบบไม่พร้อมกันในฟังก์ชันที่มีการเรียกใช้โค้ดที่ต้องรอการตอบสนองจากการทำงานอื่น ๆ ก่อน โดยการใช้ async
ประกาศว่าฟังก์ชันนั้นเป็นฟังก์ชันแบบไม่พร้อมกัน และ await
ใช้เพื่อรอให้การทำงานแบบไม่พร้อมกันเสร็จสิ้นก่อนที่จะไปขั้นตอนต่อไป
การใช้งาน
async function fetchData() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
}
กรณีที่เหมาะสมในการใช้งาน
- เมื่อคุณต้องการให้โค้ดทำงานแบบเป็นลำดับและต้องรอการตอบสนองจากงานอื่น ๆ ก่อน
- การประมวลผลข้อมูลที่ต้องใช้เวลา เช่น การเรียกข้อมูลจาก API การอ่านไฟล์ หรือการคำนวณที่ใช้เวลานาน
setTimeout
setTimeout
เป็นฟังก์ชันที่ใช้ในการตั้งเวลาก่อนที่จะทำงานตามโค้ดที่กำหนด การทำงานของ setTimeout
ไม่ได้บล็อกการทำงานของโค้ดอื่น ๆ แต่จะเรียกฟังก์ชันหลังจากครบเวลาที่กำหนดแล้ว
การใช้งาน
function delayedMessage() {
console.log('This message is delayed by 2 seconds');
}
setTimeout(delayedMessage, 2000); // แสดงข้อความหลังจาก 2 วินาที
กรณีที่เหมาะสมในการใช้งาน
- เมื่อคุณต้องการทำงานหลังจากเวลาที่กำหนด
- การเลื่อนเวลาในการทำงาน หรือการตั้งค่าการรอการตอบสนอง
- ใช้ในการรอให้ส่วนอื่นๆประมวลผลเสร็จก่อนถึงค่อยไปทำงานตามที่ฟังก์ชั่นกำหนด โดยการหน่วงเวลาการทำงานของคำสั่งออกไปเล็กน้อย
ความเหมือน และ ความแตกต่าง
ความเหมือน
- ทั้ง
async/await
และsetTimeout
สามารถใช้ในการควบคุมเวลาการทำงานในโค้ดได้ เช่น การรอให้บางสิ่งเกิดขึ้นก่อนที่จะดำเนินการต่อไป - ทั้งสองวิธีใช้ในการจัดการกับการทำงานแบบไม่พร้อมกัน แต่มีการใช้งานและจุดมุ่งหมายที่ต่างกัน
ความแตกต่าง
async/await
ใช้เพื่อจัดการกับลำดับการทำงานที่ต้องรอการตอบสนองจากงานอื่น ๆ ขณะที่setTimeout
ใช้เพื่อเลื่อนเวลาการทำงานก่อนที่จะทำงานตามโค้ดที่กำหนดasync/await
เหมาะสำหรับการจัดการกับงานที่ต้องรอให้เสร็จก่อน ขณะที่setTimeout
เหมาะกับงานที่ต้องการตั้งเวลาให้การทำงานเกิดขึ้นในภายหลัง
async/await
และ setTimeout
มีประโยชน์ในบริบทที่แตกต่างกัน ขึ้นอยู่กับวัตถุประสงค์และความต้องการของงาน หากคุณต้องการจัดการกับงานที่ต้องรอการตอบสนองหรือจัดการลำดับการทำงาน async/await
เป็นเครื่องมือที่เหมาะสม แต่ถ้าคุณต้องการเลื่อนการทำงานออกก่อนที่จะให้บางสิ่งเกิดขึ้น setTimeout
จะเป็นทางเลือกที่ดีกว่า
ตัวอย่างการใช้งาน setTimeout ในกรณีการอ่านค่าขนาดของ element หลังจากที่เนื้อหาภายในมีการเปลี่ยนแปลง
เมื่อเนื้อหาภายในของ element
มีการเปลี่ยนแปลง เช่น การอัปเดตข้อความหรือการเพิ่มเนื้อหาใหม่ ซึ่งส่งผลให้ขนาดของ element
เปลี่ยนแปลงไป หากคุณอ่านค่าขนาดของ element
ทันทีหลังจากที่เนื้อหามีการเปลี่ยนแปลง อาจได้ค่าขนาดเดิมที่ยังไม่ได้อัปเดต เพราะการเปลี่ยนแปลงของ DOM ยังไม่เสร็จสมบูรณ์ ในกรณีนี้ เราสามารถใช้ setTimeout
เพื่อรอให้การเปลี่ยนแปลงของ DOM เสร็จสมบูรณ์ก่อน แล้วจึงค่อยอ่านค่าขนาดที่ถูกต้อง
ตัวอย่างการใช้งาน
// สมมติว่ามี element ที่มี id "content"
const contentElement = document.getElementById('content');
// การเปลี่ยนแปลงเนื้อหาภายใน element
contentElement.innerHTML = '<p>Updated content that might change the size of the element.</p>';
// อ่านค่าขนาดของ element หลังจากที่เนื้อหามีการเปลี่ยนแปลง
const originalHeight = contentElement.offsetHeight;
console.log('Original Height:', originalHeight); // อาจแสดงค่าขนาดเดิมที่ยังไม่อัปเดต
// ใช้ setTimeout เพื่อรอให้การเปลี่ยนแปลงของ DOM เสร็จสมบูรณ์
setTimeout(() => {
const updatedHeight = contentElement.offsetHeight;
console.log('Updated Height:', updatedHeight); // แสดงค่าขนาดที่อัปเดตแล้ว
}, 0); // หน่วงเวลาเป็น 0 milliseconds เพื่อให้การเปลี่ยนแปลง DOM เสร็จสมบูรณ์
คำอธิบาย
- เมื่อเราเปลี่ยนแปลงเนื้อหาภายในของ
element
ทันทีแล้วอ่านค่าขนาด (offsetHeight
หรือoffsetWidth
) อาจจะได้ค่าที่ไม่ถูกต้อง เนื่องจากการเปลี่ยนแปลงของ DOM ยังไม่สมบูรณ์ - การใช้
setTimeout
แม้จะกำหนดเวลาเป็น 0 milliseconds แต่ช่วยให้การประมวลผล DOM เสร็จสิ้นก่อนที่จะอ่านค่าขนาดใหม่ ซึ่งจะได้ค่าที่ถูกต้องหลังจากการอัปเดต
การเลื่อนเวลาในการทำงานออก หรือการตั้งค่าการรอการตอบสนอง เพื่อให้แน่ใจว่าข้อมูลหรือขนาดของ element
ที่ได้เป็นค่าที่ถูกต้องหลังจากการเปลี่ยนแปลง DOM