มีหลายวิธีคืนค่าจาก asynchronous call ใน JavaScript มาเข้าใจปัญหาก่อน สมมติมีฟังก์ชัน foo ที่ async และให้ข้อมูลหลังจากผ่านไปสักพัก สามารถทำได้ 2 แบบ: รับ callback ที่จะเรียกเมื่อพร้อมพร้อมข้อมูล หรือคืน Promise
เช่น setTimeout รับ callback และ execute หลังเวลาที่กำหนด
ตัวอย่าง
function myFunc(cb) { setTimeout(() => cb(100), 1000); } myFunc((a) => console.log(a))ผลลัพธ์
100
จะเรียก setTimeout พร้อม callback execute หลัง 1000ms เมื่อ function รัน จะเรียก callback ที่ส่งไป (cb) พร้อมค่าที่ได้จาก setTimeout's callback
ใช้ Promises
Wrap async function ด้วย promise และ resolve ด้วย return value ของฟังก์ชัน แล้ว chain then ส่ง callback ใช้ค่าที่ได้
ตัวอย่าง
new Promise(resolve => setTimeout(() => resolve(100), 1000)) .then(console.log)
ผลลัพธ์
100