คุณต้องจัดการวงจรของฟังก์ชันเพื่อให้แน่ใจว่าฟังก์ชันจะทำงานได้อย่างถูกต้อง การสิ้นสุดฟังก์ชันอย่างถูกต้องจะช่วยหลีกเลี่ยงค่าใช้จ่ายที่มากเกินไปจากฟังก์ชันที่ทำงานนานเกินไปหรือวนซ้ำไม่สิ้นสุด นอกจากนี้ คุณยังตรวจสอบได้ว่าอินสแตนซ์ Cloud Functions ที่เรียกใช้ฟังก์ชันจะไม่ปิดตัวลงก่อนที่ฟังก์ชันจะถึงเงื่อนไขหรือสถานะการสิ้นสุดเรียบร้อยแล้ว
ใช้วิธีการที่แนะนำต่อไปนี้เพื่อจัดการวงจรของฟังก์ชัน
- แก้ไขฟังก์ชันที่ดำเนินการประมวลผลแบบอะซิงโครนัส (หรือที่เรียกว่า "ฟังก์ชันเบื้องหลัง") โดยแสดงผล JavaScript Promise
- สิ้นสุดฟังก์ชัน HTTP ด้วย
res.redirect(),res.send()หรือres.end() - สิ้นสุดฟังก์ชันแบบซิงโครนัสด้วยคำสั่ง
return;
ลดความซับซ้อนของโค้ดแบบอะซิงโครนัสด้วย JavaScript Promise
Promise เป็นทางเลือกที่ทันสมัยแทน Callback สำหรับโค้ดแบบอะซิงโครนัส Promise แสดงถึงการดำเนินการและค่าในอนาคตที่อาจแสดงผล นอกจากนี้ยังช่วยให้คุณเผยแพร่ข้อผิดพลาดที่คล้ายกับ try/catch ในโค้ดแบบซิงโครนัสได้ด้วย คุณอ่านเกี่ยวกับ Promise ใน Firebase SDK ได้ที่บล็อก Firebase และอ่านเกี่ยวกับ Promise โดยทั่วไปได้ที่ MDN
วิธีการทำงานของ Promise กับฟังก์ชัน
เมื่อคุณแสดงผล JavaScript Promise ไปยังฟังก์ชัน ฟังก์ชันนั้นจะทำงานต่อไปจนกว่า Promise จะได้รับการแก้ไขหรือถูกปฏิเสธ หากต้องการระบุว่าฟังก์ชันทำงานเสร็จสมบูรณ์แล้ว คุณควรแก้ไข Promise หากต้องการระบุข้อผิดพลาด คุณควรปฏิเสธ Promise ซึ่งหมายความว่าคุณต้องจัดการเฉพาะข้อผิดพลาดที่ต้องการเท่านั้น
โค้ดต่อไปนี้จะใช้ Firebase Realtime Database ref และตั้งค่าเป็น "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 ส่วนใหญ่ของเราจะมีตัวอย่างการสิ้นสุดฟังก์ชันที่เหมาะสม ตัวอย่างบางส่วนที่แสดงให้เห็นกรณีทั่วไปมีดังนี้
- ทริกเกอร์ Realtime Database: ฟังก์ชัน HTTP ตามด้วยการเปลี่ยนเส้นทาง
- ทริกเกอร์ Cloud Storage:
การดาวน์โหลดพื้นที่เก็บข้อมูลตามด้วย
then - Webhook ในการเขียน Realtime Database:
ข้อผิดพลาดที่เกิดขึ้นภายในส่วนคำสั่ง
then - ลบบัญชีที่ไม่ได้ใช้เป็นระยะๆ: สัญญาที่ถูกปฏิเสธ