เชื่อว่านักพัฒนา Node.js หลายคนน่าจะเคยเขียน Async มากันแล้วทุกคนแน่นอน วันนี้ผมเลยจะมายกตัวอย่าง และเปรียบเทียบความแต่งต่างให้ดู และรวมถึงรูปแบบการเขียนด้วย
Async มันจะเหมาะกับการ Call น้อยๆ ไม่เกินสองอัน ต่อโมดูล เพราะเมื่อไหร่ที่มีการคอลเยอะๆเกิดขึ้น เวลาก็จะเพิ่มขึ้นตามจำนวน
ถ้า Call แค่อันเดียว จะใช้เวลาแค่ 2 วิ
function resolveAfter2Seconds() {return new Promise(resolve => {setTimeout(() => {resolve('resolved');}, 2000);});}async function asyncCall() {console.time('call')console.log('calling 1');const result = await resolveAfter2Seconds();console.log(result);console.timeEnd('call')}asyncCall();
เวลาเฉลี่ยในการ call: 2004ms
ถ้า Call 2 อัน เวลาก็จะเพิ่มขึ้น
function resolveAfter2Seconds() {return new Promise(resolve => {setTimeout(() => {resolve('resolved');}, 2000);});}async function asyncCall() {console.time('call')console.log('calling 1');const result = await resolveAfter2Seconds();console.log(result);console.log('calling 2');const result2 = await resolveAfter2Seconds();console.log(result2);console.timeEnd('call')}asyncCall();
เวลาเฉลี่ยในการ call: 4007ms
วิธีแก้ปัญหา เมื่อมีการ Call มากกว่า 1 อัน
Promise.all() คือคำสั่งของ Node.js ที่น้อยคนจะรู้จัก หลักการทำงานของมันจะทำงานแบบ Array โดยการที่มันจะเรียกทุกอันพร้อมกัน และมันจะทำงานเสร็จก็ต่อเมื่ออันสุดท้าย Call เสร็จสิ้นแล้ว
ตัวอย่างโค้ด เมื่อมีการ Call หลายอันเกิดขึ้น
let i = 0function resolveAfter2Seconds() {return new Promise(resolve => {setTimeout(() => {console.log(i++)resolve('resolved');}, 2000);});}async function asyncCall() {console.time("call");const result = await Promise.all([resolveAfter2Seconds(),resolveAfter2Seconds(),resolveAfter2Seconds()])console.timeEnd("call");}asyncCall()
เวลาเฉลี่ยในการ call: 2017ms
สรุปผลจากการทดลอง ทำให้ได้ข้อสรุป
อันดับ 1 คือตัวอย่างโค้ดอันแรก เพราะเป็นการสั่ง Call ตรงๆแค่อันเดียว ไม่ได้อยู่ใน Array
อันดับ 2 คือตัวอย่างโค้ดอันที่สาม แม้ว่าจะ Call 3 อัน แต่ใช้เวลาน้อยที่สุด (เปรียบเสมือนนักวิ่งที่วิ่งมา 3 คน แต่คนที่ 1, 2 ดันเกิดอาการตะคริวกินขาขึ้นมาทำให้วิ่งไม่ได้ แต่นักวิ่งคนที่ 3 ดันมีน้ำใจขึ้นมา ช่วยพยุงคนที่ 1, 2 เข้าพร้อม)
และอันดับสุดท้าย คือตัวอย่างโค้ดอันที่สอง เพราะทำงานเป็นคิว เหมือนเรียงเลข 1, 2, 3, 4, 5 ทำให้ช้าไปหมด
เดี๋ยวบทความถัดไป จะนำ Async with Promise มาใช้ด้วยกัน
ความคิดเห็น
แสดงความคิดเห็น