Callback and Promise

การเรียกใช้โค้ด Asynchronus แบบชิคๆคุลๆ

สรุปแบบขี้เกียจอ่าน

  • Sync ใส่ input เป็น parameter ได้ output ออกมาเป็น return ของ method
  • Callbacks ใส่ input และ callback function เป็น parameter ผลลัพธ์จะผ่านมาตอน function ที่ฝากไว้โดนเรียก(จากสวรรค์)
  • Promise ใส่ input ได้ output แต่ต้องไปแงะเอาข้อมูลข้างใน output มาใช้เอง

ปล. ไว้เข้าใจ Generator, Async-Await แล้วจะมาอัพเดท

Sync

อันนี้ไม่ใช่ async แต่ใส่มาไว้เปรียบเทียบ ใส่ input แล้วก็เรียก method ได้ output ตรงๆ

function doStuff(input) {
  return "output";
}

let output = doStuff("input");
console.log(output);

Callback

ใส่ input เป็น parameter เหมือนปกติ แต่ใส่ callback method เข้าไปด้วย แต่จะไม่ได้อะไรคืนมาจาก method

output จะผ่านมาเป็น parameter ของ callback ที่ฝากไว้ จะทำอะไรกับ output นั้นก็ต้องใส่ไว้ที่ callback

function doStuff(input, callback) {
  callback("output");
}

let myCallback = (output) => { console.log(output) };

doStuff("input", myCallback);

Promise

ใส่ input เป็น parameter เหมือนปกติ แล้วก็ได้ output ทาง method ซึ่งเหมือนจะโดนหลอกว่าได้ผลลัพธ์ปกติ แต่ต้องไป “แงะ” เอาผลลัพธ์ข้างในออกมาเอง

function doStuff(input) {
  return Promise.resolve("output")
}

let returnedPromise = doStuff("input");

returnedPromise.then( (output) => {console.log(output);} )

อันนี้จะทำให้เหมือนโดนหลอกว่าเป็น synchronous call แต่อย่าลืมว่า มันไม่ได้ block ตรงที่ then นะ มันจะผ่านไปเลย แล้วก็เรียก function ข้างในเมื่อ promise มันพร้อม

Convert Callback to Promise

แปลงได้โดยการเรียกสร้าง promise ที่ไปเรียก method เดิม โดย callback ที่ส่งเข้าไปจะไปเรียก resolve ของ promise เมื่อต้องการจะส่ง output ออกมา

//Original callback accepting method
function doStuff(input, callback) {
  callback("output");
}

function doStuffPromise(input) {
  return new Promise((resolve) => {
    doStuff(input, (output) => { resolve(output); })
  })
}