การซิงค์ ไม่พร้อมกัน และสัญญา

การจัดการวงจรการใช้งานของฟังก์ชันเพื่อให้แน่ใจว่าจะมีการแก้ปัญหาอย่างถูกต้อง การสิ้นสุดฟังก์ชันต่างๆ อย่างถูกต้องทำให้คุณสามารถหลีกเลี่ยงการเรียกเก็บเงินที่มากเกินไปจากฟังก์ชันที่ทำงานนานเกินไปหรือวนซ้ำไม่สิ้นสุด นอกจากนี้ คุณยังตรวจสอบได้ว่าอินสแตนซ์ Cloud Functions ที่เรียกใช้ฟังก์ชันไม่ปิดการทำงานก่อนที่ฟังก์ชันจะบรรลุเงื่อนไขหรือสถานะสิ้นสุดโดยสมบูรณ์

ใช้วิธีการที่แนะนำต่อไปนี้เพื่อจัดการวงจรของฟังก์ชัน

  • จับคู่ฟังก์ชันที่ประมวลผลแบบไม่พร้อมกัน (หรือที่เรียกว่า "ฟังก์ชันพื้นหลัง") โดยแสดงผลสัญญา JavaScript
  • สิ้นสุดฟังก์ชัน HTTP ด้วย res.redirect(), res.send() หรือ res.end()
  • ยุติฟังก์ชันซิงโครนัสด้วยคำสั่ง return;

ลดความซับซ้อนของโค้ดแบบอะซิงโครนัสด้วย JavaScript สัญญา

Promises เป็นทางเลือกที่ทันสมัยซึ่งใช้แทน Callback สำหรับโค้ดแบบอะซิงโครนัส คำสัญญาแสดงถึงการดำเนินการและคุณค่าในอนาคตที่การกระทำนั้นอาจกลับมา นอกจากนี้ยังช่วยให้คุณเผยแพร่ข้อผิดพลาดที่คล้ายกับการลอง/จับในโค้ดแบบซิงโครนัสได้อีกด้วย อ่านเกี่ยวกับสัญญาได้ใน Firebase SDK ในบล็อกของ Firebase และเรื่องสัญญาโดยทั่วไปใน MDN

วิธีที่สัญญาทำงานร่วมกับฟังก์ชัน

เมื่อคุณคืนค่า JavaScript เป็นฟังก์ชัน ฟังก์ชันนั้นจะยังคงทำงานต่อไปจนกว่าจะมีการแก้ไขหรือปฏิเสธสัญญา ในการแสดงให้เห็นว่าฟังก์ชันหนึ่งๆ ทำงานได้เสร็จสมบูรณ์แล้ว สัญญาควรได้รับการแก้ไข ในการระบุข้อผิดพลาด ควรปฏิเสธสัญญา ซึ่งหมายความว่าคุณแค่ต้องจัดการกับ ข้อผิดพลาดที่ต้องการเท่านั้น

โค้ดต่อไปนี้ใช้ ref ของฐานข้อมูลเรียลไทม์ของ Firebase และกำหนดค่าเป็น "world!" เมื่อส่งคืนผลลัพธ์ของ set เรารับประกันว่าฟังก์ชันของคุณจะทำงานต่อไปจนกว่างานแบบไม่พร้อมกันที่เขียนสตริงไปยังฐานข้อมูลจะเสร็จสิ้นอย่างสมบูรณ์

// Always change the value of "/hello" to "world!"
exports.hello = functions.database.ref('/hello').onWrite(event => {
  // set() returns a promise. We keep the function alive by returning it.
  return event.data.ref.set('world!').then(() => {
    console.log('Write succeeded!');
  });
});

ตัวอย่างในบริบท

ตัวอย่างโค้ดของ Cloud Functions ส่วนใหญ่จะมีตัวอย่างการสิ้นสุดฟังก์ชันที่ถูกต้อง ตัวอย่างกรณีที่พบโดยทั่วไปมีดังนี้