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