Catch up on highlights from Firebase at Google I/O 2023. Learn more

ซิงค์ อะซิงโครนัส และสัญญา

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

ใช้วิธีการที่แนะนำเหล่านี้เพื่อจัดการวงจรชีวิตของฟังก์ชันของคุณ:

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

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

สัญญาเป็นทางเลือกที่ทันสมัยในการเรียกกลับสำหรับรหัสอะซิงโครนัส คำมั่นสัญญาแสดงถึงการดำเนินการและมูลค่าในอนาคตที่อาจกลับมา นอกจากนี้ยังช่วยให้คุณเผยแพร่ข้อผิดพลาดที่คล้ายกับการลอง/จับในโค้ดแบบซิงโครนัส คุณสามารถอ่านเกี่ยวกับคำสัญญาใน 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 ส่วนใหญ่ของเรามีตัวอย่างการยุติฟังก์ชันที่เหมาะสม นี่คือบางส่วนที่แสดงให้เห็นถึงกรณีทั่วไป: