ความต่าง NODE.JS ASYNC กับ PROMISE

 


เชื่อว่านักพัฒนา 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 = 0

function 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 มาใช้ด้วยกัน 

ความคิดเห็น